Bonjour à tous,
Je viens ici pour demander un petit coup de main concernant un de mes programmes qui mets beaucoup de temps à s'exécuter.
Meme si le nombre de donnée est relativement tres élévé, je pense que mon algorithme y est aussi pour un peu.
L'idée du programme est celle ci:
Pour une sous-famille d'un article, conter les qté des articles vendus et faire leur total.
Les données dont j'ai à disposition
un tableau t1 avec chaque article vendu ainsi que le prix et la qté.
un tableau t2 avec les sous familles (sans doublons)
un tableau t3 avec les familles associées à leur sous famille ainsi que les articles y faisant partie (ici avec doublons sur les familles et sous famille).
N'ayant pas trouvé un moyen de retour un triplet (sous fam, qte, prix)
du coup j'ai fait deux hashmap un avec <Sous famille, qté> et un avec <Sous famille , total>
correspondance des variables:
resultatCaisse = t1
Je vous demande de m'excuser par avance pour la longueur du code que je mets.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 try { if(resultatCaisse !=null){ while (resultatCaisse.next()){ hm3.put(resultatCaisse.getString(1),true); //System.out.println(resultatCaisse.getString(1)); } }else{ hm3.put("pas de ventes" ,true); } //resultatCaisse.beforeFirst(); //Ajout des sous familles existantes while(resultatSfamilleDistinct.next()){ vecteurSousFamDis.addElement(resultatSfamilleDistinct.getString(1)); } resultatSfamilleDistinct.beforeFirst(); }catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try{ if(resultatCaisse!=null){ resultatCaisse.beforeFirst(); //Parcours du tableau des sous familles while(resultatSfamilleDistinct.next()){ //recupere le code sf courant String codesf=resultatSfamilleDistinct.getString(1); hm1.put(codesf, 0.0); hm2.put(codesf, 0); //parcours lignes caisse while(resultatCaisse.next()){ //parcours les sous familles choisies String codeart=resultatCaisse.getString(1); //tableau permet de savoir si l'article a ete trouvé auparavant dans le resultat resultatSfamAvecFamChoisie //ce qui evite de reparcourir chaque occurrence de ce code article le resultatSfamAvecFamChoisie //faux pour dire que l'article n'est pas encore trouve boolean flag=false; if(hm3.get(codeart)){ while(resultatSfamAvecFamChoisie.next()){ //si l'article caisse egal article dans sous famille choisie String sfc=resultatSfamAvecFamChoisie.getString(2); //Si le code article est plus grand ou egal au premier code article de resultatSfamAvecFamChoisie //alors les autres tests peuvent être fait. sinon c'est que l'article ne fait pas partie du resultat, donc inutile de le tester sur tout resultatSfamAvecFamChoisie if(Integer.parseInt(codeart)>=Integer.parseInt(sfc)){ //teste si le code article est present dans resultatSfamAvecFamChoisie if(codeart.compareTo(sfc)==0){ //si cette sous famille choisie egal sous famille courante if(resultatSfamAvecFamChoisie.getString(1).compareTo(codesf)==0){ //System.out.println(codesf + "::"+ codeart + ":"+hm1.get(codesf)+":"+resultatCaisse.getDouble(3)); hm1.put(codesf,(hm1.get(codesf)+resultatCaisse.getDouble(3))); hm2.put(codesf,(hm2.get(codesf)+resultatCaisse.getInt(2))); flag=true; break; } flag=true; } }else{ break; } } //si le flag placé dans le test de code art et resultatSfamAvecFamChoisie est vrai c'est que l'article à ete trouvé une fois //sinon l'article n'est pas trouvé lorsqu'on de parcourir tout resultatSfamAvecFamChoisie a fini donc on met dans le tableau hm3 flag à faux afin de ne plus le chercher dans les recherches futures. if(!flag)hm3.put(codeart, false); } resultatSfamAvecFamChoisie.beforeFirst(); } resultatCaisse.beforeFirst(); } }else{ hm1.put("pas de vente", 0.0); hm2.put("pas de vente", 0); } }catch(SQLException e){ e.printStackTrace(); } tabHash[0]=hm1; tabHash[1]=hm2;
Partager