Bonjour,
voila jai une liste qui contient par exemple comme le montre la photo :
j'aimerais parcourir la liste recuperer le premier element puis le verifier dans toute la liste . si elle se repete je fait la somme du nombre d'heure puis j'insert la valeur dans une nouvelle liste . ainsi jusqu'a la fin .
donc au finish ma nouvelle liste ne doit pas avoir de doublons .
merci
oui vous avez parfaitement raison
j' envoi le code pour que vous compreniez mieux
voici la methode que j'ai fait pour me retournee une liste de donnees.
Dans cette derniere nous avons des donnees calculees et ces donnees
public List<JourneesTravaillees> DetailsPaie1(String datedebut, String dateFin) throws RemoteException {
List<JourneesTravaillees> list = new ArrayList<>();
String sql = "select * "
+ "from JourneesTravaillees jr join Personnel p on(jr.matricule=p.matricule)"
+ " join Fonctions f on (f.code_fonction=jr.code_fonction)"
+ " join SalaireHoraire sh on (sh.categorie=jr.categorie)"
+ " where jr.date BETWEEN '" + datedebut + "' and '" + dateFin + "' ";
JourneesTravaillees jr = null;
try {
DB db = DB.getInstance();
ResultSet rs = db.My_ExecuteQuery(sql);
while (rs.next()) {
jr = new JourneesTravaillees();
Personnel p = new Personnel();
p.setMatricule(rs.getInt("matricule"));
p.setNom_journalier(rs.getString("nom_journalier"));
jr.setPersonnel(p);
jr.setJour(rs.getString(2));
Fonctions f = new Fonctions();
f.setCode_fonction(rs.getInt("code_fonction"));
f.setNom_fonction(rs.getString("nom_fonction")) ;
jr.setFonction(f);
jr.setNb_heures(rs.getInt(4));
jr.setDate(rs.getDate(5).toLocalDate());
SalaireHoraire sh = new SalaireHoraire();
sh.setCategorie(rs.getString("categorie"));
sh.setTaux_horaire(rs.getFloat("taux_horaire"));
sh.setIR(rs.getFloat("IR"));
jr.setCategorie(sh);
jr.setCategorie_speciale(rs.getString(7));
//mes calcules
jr.setPanier(Panier(rs.getInt(4)));
jr.setSalissure(Salissure(rs.getInt(4)));
jr.setSalaire_base(SalaireBase(rs.getInt(4), getTauxHoraireByCategorie(rs.getString("categorie"))));
jr.setConges(Conges(jr.getSalaire_base(), jr.getSalissure()));
jr.setSalBase_cong(SalBaseCong(jr.getSalaire_base(), jr.getConges()));
jr.setTmp2(tmp2(jr.getSalBase_cong()));
jr.setA(A(jr.getTmp2()));
jr.setB(B(jr.getA()));
jr.setDp(dp(jr.getB()));
jr.setC(C(jr.getB()));
jr.setTx_18(tx_18(jr.getC()));
jr.setTx_22(tx_22(jr.getC()));
jr.setTx_25(tx_25(jr.getC()));
jr.setTx_28(tx_28(jr.getC()));
jr.setTotal_tx(total_tx(jr.getTx_18(), jr.getTx_22(), jr.getTx_25(), jr.getTx_28()));
jr.setD(D(jr.getTotal_tx()));
jr.setDpr(dpr(jr.getD()));
jr.setTotalpanier(TotalPanier(jr.getPanier()));
jr.setIr(IR(jr.getDp(), jr.getDpr()));
jr.setBase_trimf(Base_Trimf(jr.getSalBase_cong(), jr.getSalissure()));
jr.setTrimf_B(TrimF_B(jr.getBase_trimf()));
jr.setTrimF(TrimF(jr.getTrimf_B()));
jr.setSalaireNetPercue(Salaire_Net_Percue(jr.getSalBase_cong(), jr.getSalissure(), jr.getTotalpanier(), jr.getPanier(), jr.getIr(), jr.getTrimF()));
list.add(jr);
}
} catch (Exception ex) {
Logger.getLogger(Implementation.class.getName()).log(Level.SEVERE, null, ex);
}
return list;
}
maintenant voila ma classe controller :
@FXML void ActionRechercher(ActionEvent event) { Utils.init(); try { if(txtDateDebut1.getValue() !=null && txtDateFin1.getValue() !=null) { List<JourneesTravaillees> listjr =Utils.getIClass().DetailsPaie1(txtDateDebut1.getValue().toString(),txtDateFin1.getValue().toString()); if(listjr.isEmpty()){ Notification("INFORMATION", "NOUS N'AVONS PAS TROUVER DE PERSONNEL A CETTE DATE " + "VEILLEZ REVOIR S'IL VOUS PLAIT"); return; }
colmat.setCellValueFactory(new PropertyValueFactory<>("matricule")); colnom.setCellValueFactory(new PropertyValueFactory<>("nom_journalier")); colnbheure.setCellValueFactory(new PropertyValueFactory<>("nb_heures")); coljournee.setCellValueFactory(new PropertyValueFactory<>("journee")); colSalisure.setCellValueFactory(new PropertyValueFactory<>("salissure")); colpanier.setCellValueFactory(new PropertyValueFactory<>("panier")); colsalBase.setCellValueFactory(new PropertyValueFactory<>("salaire_base")); colsalcong.setCellValueFactory(new PropertyValueFactory<>("conges")); colsalbasecong.setCellValueFactory(new PropertyValueFactory<>("salBase_cong")); colpanierTotal.setCellValueFactory(new PropertyValueFactory<>("totalpanier")); colCalaireNet.setCellValueFactory(new PropertyValueFactory<>("salaireNetPercue")); tableview.setItems(FXCollections.observableArrayList(Utils.transform1(newList))); }else{ Notification("INFORMATION", "Il est obligatoire de choisir une date de debut et une date defin");
matricule Nom Salaire
01 ABOU 20
07 DIALLO 30
01 ABOU 70
89 KX 100
01 ABOU 30
face a ce résultat j'aimerais parcourir la liste regroupant les informations par Matricule , Nom et faire la somme de leur Salaire.
donc au finish on doit avoir sa :
matricule Nom Salaire
01 ABOU 120
07 DIALLO 30
89 KX 100
Quel rapport entre le code que tu nous donnes et ton problème ?
Je ne vois pas où tu fais le regroupement de tes données...
Voici un exemple en partant de zéro :
Personnel abou = new Personnel(1, "ABOU");
Personnel diallo = new Personnel(7, "DIALLO");
Personnel kx = new Personnel(89, "KX");
Date juin = computeJourPaie(1, 6, 2017);
Date juillet = computeJourPaie(3, 7, 2017);
Date aout = computeJourPaie(1, 8, 2017);
List<FichePaie> fichesPaies = Arrays.asList(
new FichePaie(abou, juin, 20),
new FichePaie(diallo, juin, 30),
new FichePaie(abou, juillet, 70),
new FichePaie(kx, juillet, 100),
new FichePaie(abou, aout, 30)
);
System.out.println(fichesPaies); // 1 ABOU 20.0, 7 DIALLO 30.0, 1 ABOU 70.0, 89 KX 100.0, 1 ABOU 30.0
Map<Personnel, Double> salairesCumules = new HashMap<>();
for (FichePaie paie : fichesPaies) {
Personnel employe = paie.getEmploye();
Double cumul = salairesCumules.get(employe);
if (cumul == null) {
cumul = paie.getMontant();
} else {
cumul += paie.getMontant();
}
salairesCumules.put(employe, cumul);
}
System.out.println(salairesCumules); // 1 ABOU=120, 7 DIALLO=30, 89 KX=100
Le reste du code :
public class Personnel {
private int matricule;
private String nom;
public Personnel(int matricule, String nom) {
this.matricule = matricule;
this.nom = nom;
}
@Override
public String toString() {
return matricule + " " + nom;
}
}
public class FichePaie {
private Personnel employe;
private Date jourPaie;
private double montant;
public FichePaie(Personnel employe, Date jourPaie, double montant) {
this.employe = employe;
this.jourPaie = jourPaie;
this.montant = montant;
}
public Personnel getEmploye() {
return employe;
}
public double getMontant() {
return montant;
}
@Override
public String toString() {
return employe + " " + montant;
}
}
public static Date computeJourPaie(int day, int month, int year) {
Calendar cal = Calendar.getInstance();
cal.set(year, month, day);
return cal.getTime();
}
Bonjour , ok je vois
j"ai essaye en me basant sur votre logique mais sa ya toujour des doublons lorque que visualise le resultat dans la console .
Aussi je doit faire mon affichage a partir d'un tableview
il me dit comme erreur " java.util.HashMap cannot be cast to java.util.List"
mais sa me signale une erreur au niveau de la premier boucle for :
Caused by: java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
Je n'ai pas compris ce que tu essayais de faire, et je n'essaye même pas, c'est un code partiel, je n'ai pas le contexte, donc je me limite à l'analyse du bug.
voila la liste qui contient mes donnees avec doublons ;
mais sa me signale une erreur au niveau de la premier boucle for :
Caused by: java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
La liste sur laquelle tu boucles doit garder les même valeurs, sinon ça décalerait tout.
Enlèves la ligne de ta boucle, et après ta boucle tu ajoutes
je vais le faire a plus