Question sans rapport : Est-ce que le fait d'editer le dernier post compte comme un nouveau post ?
Version imprimable
Question sans rapport : Est-ce que le fait d'editer le dernier post compte comme un nouveau post ?
Non une édition ne compte pas comme un nouveau post !
Je préférai honnêtement que tu suive les indication que je te donne sur les étapes. Car, tu aura du code qui fonctionne à la fin. et plus rapidement que tu brule les étapes.
Je vais donnée le appel que fait le main pour chaque étapes :
Il y a deux fonctions staticCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 //1. Tu crée une école en dur Ecole monEcole = new Ecole("LeNomCodeEcole"); //2. Tu affiche son nom en console. System.out.println(monEcole.getNom()); //3. Tu ajoute ajout une occurrence à une note pour un niveau. monEcole.ajoutOccurenceNiveau("CP"); //4. Tu affiche ne nombre doccurrence pour tout les niveau pour l'école. System.out.println(ecole.getStatistique()); //5. Tu crée une Map avec pour clé le nom de l'école et en valeur l'objet. Map<String, Ecole> mapEcoles = new HashMap<String, Ecole>(); //6. Tu ajout l'école précédent à la liste. mapEcoles.put(monEcole.getNom(),monEcole); //7. Tu crée une fonction qui ajoute une statique à une école. Via la fonction suivante : ajouteEcoleNiveau(mapEcoles, "UneAutreEcole", "CE1"); //8. Faire une fonction qui affiche pour toutes les écoles de la liste toutes les notes. (Doit nécessairement reprendre ce qui a été fait en .4) afficheStatistiqueListe(mapEcoles); //9. Tu réalise la lecture de ton fichier en reprenant tout ce que tu as fait avant. mapEcoles = new HashMap<String, Ecole>(); // Remplace la liste par une nouvelle liste CSVReader reader = new CSVReader(new FileReader(cheminCSV+"Eleves_"+Annee+".dbf"),';','$',1); while ((nextLine2 = reader2.readNext()) != null){ ajouteEcoleNiveau(mapEcoles, nextLine2[3], nextLine2[4]); } afficheStatistiqueListe(mapEcoles);
Code:
1
2
3 public static void ajouteEcoleNiveau(Map<String,Ecole>,String ecole,String niveau){ //TODO Méthode à réaliser }
Cordialement,Code:
1
2
3 public static void afficheStatistiqueListe(Map<String,Ecole>){ //TODO Méthode à réaliser }
Patrick Kolodziejczyk.
Bon, je vais encore recommencer alors x) mais demain matin, j'ai finis ma journée.
Derniere question avant de partir :
Voila, je voulais avoir votre avis : ca fait un peu plus d'un mois maitenant que j'apprends le java, est-ce que vous trouvez que, pour quelqu'un de mon niveau, 3 jours c'est long pour devellopper un programme comme celui. J'ai l'impression de galerer enormement, et meme de trop, vu que je n'ai personne pour m'apprendre/m'expliquer a part vous.
Cordialement,
Bonne soirée
Cela la dépends de ce que tu appel débutant.
Un personne qui a déjà fait un autre langage de programmation fonctionnel ou objet sera largement avantagé. Pour plusieurs raisons :
- Il découpera son problème en sous problème jusqu'à avoir quelque chose de très simple à faire.
- Il sera faire la correspondance de son découpage en fonction
- Il sera faire abstraction du langage et se basé sur le comportement que son logiciel doit avoir.
Visiblement tu n'as pas eu de formation sérieuse en informatique.
En général, on apprends aux étudiants à transformer un problème en un "pseudo code". Celui-ci étant indépendant de tout langage, c'est juste la logique métier découpé très finement. Le bût étant d'avoir une grille d'écriture pour ton code.
De même le découpage en fonction est très fréquent pour une raison simple, cela réduit la complexité de chaque élément. Le plus fréquent, on crée une fonction pour ce qu'on veux faire. monEcole.ajoutOccurenceNiveau("CP"); et ajouteEcoleNiveau(mapEcoles, nextLine2[3], nextLine2[4]); sont des exemples typique.s On ne sait pas comment on va faire l'implémentation, mais on sait que c'est possible. (A la fonction de se démerder pour que ça marche.) Si il y a une partie d'une fonction que tu ne sais pas faire, mais que tu identifié les entrées et les sorties de cette partie, tu fait une fonction qui le fera pour toi. Cela découpe le gros problème en plein de petite problème.
Ton apprentissage est certes lent, mais il te manque énormément de base théorique. Tu devrais lire des cours et tutoriels Java (les faire), mais aussi apprend la théorie que se trouve dernière le langage.
Il y a d’ailleurs un très bon guide ici :
http://baptiste-wicht.developpez.com.../java/debuter/
Et le tutoriel que tout le monde recommande est celui-ci (de mémoire) :
http://java.developpez.com/livres-co...s/javaenfants/
La partie théorique est plus vue ici :
http://jmdoudoux.developpez.com/cours/developpons/java/
Pour moi, un personne qui veux développer en Java doit comprendre les 5 premiers chapitres. Les autres sont plus optionnels.
Cordialement,
Patrick Kolodziejczyk.
Ps : Oui, pour un professionnel ton application se fait en 1 heure maximum. Mais le bût, pour moi, ce n'est pas que ton programme soit "finit", c'est que tu ai compris les base de la programmation qui sont lié à ce programme. Histoire que tu soit capable de faire le suivant seul et plus rapidement.
Bonjour.
Et bien durant ma formation, je n'ai appris qu'un langage, le python, et je ne peux pas dire que l'apprentissage de ce langage etait vraiment poussé .. De quoi codé un snake ou un 2048.
Et puis il y a peut etre le fait que je suis une bille en math ^^
Merci pour la doc, j'irai la lire plus tard.
En ce qui concerne mon programme, je viens de finir les 8 premieres etapes, je fais la 9e et j'aurais finis ! :)
Code:
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 public class test { public static void ajouteEcoleNiveau(Map<String,Ecole> eMap,String autreEcole,String niveau){ if(eMap.get(autreEcole)== null){ System.out.println("l'ecole n'est pas dans la map"); Ecole newEcole = new Ecole(autreEcole); eMap.put(autreEcole,newEcole); newEcole.ajoutOccurenceNiveau(niveau); System.out.println(newEcole.getCodeEcole()); } else{System.out.println("l'ecole est dans la map"); eMap.get(autreEcole).ajoutOccurenceNiveau(niveau); } } public static void afficheStatistiqueListe(Map<String,Ecole> eMap){ Set<String> cles = eMap.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()){ //parcour la hashMap Object cle = it.next(); //recupere la clé Object valeur = eMap.get(cle); //recupere la valeur System.out.println((String)cle); //affiche la clé(CodeEcole) ((Ecole) valeur).getStatistique(); //affiche les niveaux de l'ecole } } public static void main(String[] args) { Ecole monEcole = null; monEcole = new Ecole("005432L"); //1. Tu crée une école en dur System.out.println(monEcole.getCodeEcole()); //2. Tu affiches son nom en console. monEcole.ajoutOccurenceNiveau("CP"); //3. Tu ajoute ajout une occurrence à une note pour un niveau. monEcole.getStatistique(); //4. Tu affiche ne nombre doccurrence pour tout les niveau pour l'école. System.out.println("-------"); Map<String, Ecole> mapEcoles = new HashMap<String, Ecole>(); //5. Tu crée une Map avec pour clé le nom de l'école et en valeur l'objet. mapEcoles.put(monEcole.getCodeEcole(),monEcole); //6. Tu ajout l'école précédent à la liste. ajouteEcoleNiveau(mapEcoles, "UneAutreEcole", "TPS"); //7. Tu crée une fonction qui ajoute une statique à une école. Via la fonction suivante : System.out.println("-------"); ajouteEcoleNiveau(mapEcoles, "encoreUneAutreEcole", "CM2"); ajouteEcoleNiveau(mapEcoles, "encoreUneAutreEcole", "CM1"); System.out.println("-------"); afficheStatistiqueListe(mapEcoles); //8. Faire une fonction qui affiche pour toutes les écoles de la liste toutes les notes. } }
Code:
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
82
83
84
85
86
87
88
89 import java.util.ArrayList; public class Ecole { protected String codeEcole; public int[] statistique = new int[10]; public static int TPS = 0; public static int PS = 1; public static int MS = 2; public static int GS = 3; public static int CP = 4; public static int CE1 = 5; public static int CE2 = 6; public static int CM1 = 7; public static int CM2 = 8; public static int TOTAL = 9; public Ecole(String eCode){ System.out.println("\n Création d'une ecole avec parametre !"); codeEcole = eCode; } public void ajoutOccurenceNiveau(String eNiveau){ statistique[TOTAL]+=1; switch (eNiveau) { case "TPS": statistique[TPS]+=1; break; case "PS": statistique[PS]+=1; break; case "MS": statistique[MS]+=1; break; case "GS": statistique[GS]+=1; break; case "CP": statistique[CP]+=1; break; case "CE1": statistique[CE1 ]+=1; break; case "CE2": statistique[CE2]+=1; break; case "CM1": statistique[CM1]+=1; break; case "CM2": statistique[CM2]+=1; break; default: } } //---------------------Accesseurs--------------------------- public String getCodeEcole() //Retourne le code de l'ecole { return codeEcole; } public void getStatistique(){ //retourne les nb d'occurence des niveaux ArrayList<String> listeNiveau = new ArrayList<String>(); listeNiveau.add("TPS"); listeNiveau.add("PS"); listeNiveau.add("MS"); listeNiveau.add("GS"); listeNiveau.add("CP"); listeNiveau.add("CE1"); listeNiveau.add("CE2"); listeNiveau.add("CM1"); listeNiveau.add("CM2"); listeNiveau.add("TOTAL"); for(int i= 0; i<statistique.length;i++){ System.out.print(listeNiveau.get(i)+" : "+statistique[i]+" "); } System.out.println(); } }
Petites corrections par rapport au facilité du langage :
Peut-être codé de cette manière :Code:
1
2
3
4
5
6
7
8
9
10
11
12 public static void afficheStatistiqueListe(Map<String,Ecole> eMap){ Set<String> cles = eMap.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()){ //parcour la hashMap Object cle = it.next(); //recupere la clé Object valeur = eMap.get(cle); //recupere la valeur System.out.println((String)cle); //affiche la clé(CodeEcole) ((Ecole) valeur).getStatistique(); //affiche les niveaux de l'ecole } }
Et :Code:
1
2
3
4
5
6 public static void afficheStatistiqueListe(Map<String,Ecole> eMap){ for(Ecole ecole : eMap.entrySet()){ System.out.println(ecole.getNom()); //affiche la clé(CodeEcole) ecole.getStatistique(); //affiche les niveaux de l'ecole } }
Pourrait-être fait d'une autre manière, mais je voudrai surtout te présenter le StringBuilder et la concaténation :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public void getStatistique(){ //retourne les nb d'occurence des niveaux ArrayList<String> listeNiveau = new ArrayList<String>(); listeNiveau.add("TPS"); listeNiveau.add("PS"); listeNiveau.add("MS"); listeNiveau.add("GS"); listeNiveau.add("CP"); listeNiveau.add("CE1"); listeNiveau.add("CE2"); listeNiveau.add("CM1"); listeNiveau.add("CM2"); listeNiveau.add("TOTAL"); for(int i= 0; i<statistique.length;i++){ System.out.print(listeNiveau.get(i)+" : "+statistique[i]+" "); } System.out.println(); } }
Ce que tu fait là listeNiveau.get(i)+" : "+statistique[i]+" " c'est de la concaténation. lorsque cela est réalise plien de fois, cela consomme beaucoup de mémoire. Car tu crée les objet String correspondant à tout les intermédiaires.
Tu peux donc faire :
Ce qui te permet au lieu d'avoir un affichage directement en console, de récupérer les statistiques sont forme d'un string formaté que tu peux soit afficher soit enregistrer dans un fichier. (Ou encore autre chose.)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public String getStatistique(){ //retourne les nb d'occurence des niveaux ArrayList<String> listeNiveau = new ArrayList<String>(); listeNiveau.add("TPS"); listeNiveau.add("PS"); listeNiveau.add("MS"); listeNiveau.add("GS"); listeNiveau.add("CP"); listeNiveau.add("CE1"); listeNiveau.add("CE2"); listeNiveau.add("CM1"); listeNiveau.add("CM2"); listeNiveau.add("TOTAL"); StringBuilder sb = new StringBuilder(); for(int i= 0; i<statistique.length;i++){ sb.append(listeNiveau.get(i)); sb.append(" : "); sb.append(statistique[i]); sb.append(" "); } return sbToString(); } }
Il serai possible de revoir la méthode utiliser pour la gestion de la liste des niveaux. Mais ce que tu fait est relativement correcte.
Cependant, on peut mettre cette liste en static ce qui évitera de la recréer à chaque fois :
Cordialement,Code:
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 private static List<String> listeNiveau = null; public static getListeNiveau(){ if(listeNiveau == null){ listeNiveau = new ArrayList<String>(); listeNiveau.add("TPS"); listeNiveau.add("PS"); listeNiveau.add("MS"); listeNiveau.add("GS"); listeNiveau.add("CP"); listeNiveau.add("CE1"); listeNiveau.add("CE2"); listeNiveau.add("CM1"); listeNiveau.add("CM2"); listeNiveau.add("TOTAL"); } return listeNiveau; } public String getStatistique(){ //retourne les nb d'occurence des niveaux StringBuilder sb = new StringBuilder(); for(int i= 0; i<getListeNiveau().length;i++){ sb.append(getListeNiveau().get(i)); sb.append(" : "); sb.append(statistique[i]); sb.append(" "); } return sbToString(); }
Patrick Kolodziejcyzk.
C'est parfait ! Merci pour les améliorations :D
Je n'ai pas changer cette partie de code :Car Eclipse me soulignait en rouge, et a proposé ces modifications : ( ca créait d'autres probleme ailleurs)Code:
1
2
3
4
5
6
7
8
9
10
11
12 public static void afficheStatistiqueListe(Map<String,Ecole> eMap){ Set<String> cles = eMap.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()){ //parcour la hashMap Object cle = it.next(); //recupere la clé Object valeur = eMap.get(cle); //recupere la valeur System.out.println((String)cle); //affiche la clé(CodeEcole) ((Ecole) valeur).getStatistique(); //affiche les niveaux de l'ecole } }
Code:
1
2
3 //for(Entry<String, Ecole> ecole : eMap.entrySet()){ //System.out.println(((Ecole) ecole).getCodeEcole()); //affiche la clé(CodeEcole) //((Ecole) ecole).getStatistique(); //affiche les niveaux de l'ecole
En tout cas je te remercie infiniment ! j'ai enfin finit mon logiciel et il marche a merveille :) il essayerait de courrir si il pouvait.
Je mets mon code pour les futurs visiteurs :
Code:
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.AbstractButton; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.UIManager; import com.opencsv.CSVReader; public class Main extends JFrame{ private JTextField chemin_fichierCSV; private JButton btnParcourirCSV; private JButton btnGoCSV; private JFileChooser fc_parcourirCSV; private String fichier; private BufferedWriter bw; private static BufferedWriter bw2; private JFileChooser fc_saveCSV; private String cheminCSV; private JTextField textField; private String Annee; private int toInt; private CSVReader reader,reader2; private List<Ecole> listeCodeEcole; private Ecole monEcole; public Main (){ fc_parcourirCSV = new JFileChooser(); fc_saveCSV = new JFileChooser(); //------------Parametre de la fenetre ------------ this.setTitle("Extraction Eleves -> .dbf"); //le titre this.setSize(580, 140); //les dimensions this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //ferme quand on appuie sur la croix this.setLocationRelativeTo(null); //place au milieu de l'ecran this.getContentPane().setLayout(null); //------------Label "fichier .CSV :" ------------ JLabel lblFichierCSV = new JLabel("Fichier .CSV : ",JLabel.CENTER); lblFichierCSV.setBounds(18, 11, 129, 14); //Positionnement et dimensions getContentPane().add(lblFichierCSV); //------------Chemin du fichier CSV ------------ chemin_fichierCSV = new JTextField(); chemin_fichierCSV.setEditable(false); //desactive chemin_fichierCSV.setBounds(145, 8, 260, 20); getContentPane().add(chemin_fichierCSV); chemin_fichierCSV.setColumns(10); //------------Bouton parcourir CSV ------------ btnParcourirCSV = new JButton("Parcourir..."); //btnParcourirCSV.setEnabled(false); btnParcourirCSV.setBounds(425, 8, 116, 20); btnParcourirCSV.setHorizontalTextPosition(AbstractButton.LEADING); //btnParcourirCSV.setIcon(icon); this.getContentPane().add(btnParcourirCSV); //------------Bouton Enregistrer CSV------------ btnGoCSV = new JButton("Enregistrer"); btnGoCSV.setBounds(425, 55, 116, 20); btnGoCSV.setEnabled(false); //desactive this.getContentPane().add(btnGoCSV); //------------Label Année------------ JLabel lblAnne = new JLabel("Ann\u00E9e : "); lblAnne.setBounds(75, 38, 46, 14); getContentPane().add(lblAnne); //------------Formulaire Année------------ textField = new JTextField(); textField.setText("20**"); textField.setEditable(false); textField.setBounds(144, 35, 59, 20); getContentPane().add(textField); textField.setColumns(10); //------------Quand on clic sur le bouton parcourir------------ btnParcourirCSV.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { fc_parcourirCSV.showOpenDialog(null); //ouvre une fenetre if (fc_parcourirCSV.getSelectedFile() != null) { fichier = fc_parcourirCSV.getSelectedFile().toString(); //On prend le chemin chemin_fichierCSV.setText(fichier); //On l'affiche dans le formulaire désactivé textField.setEditable(true); btnGoCSV.setEnabled(true); //active le bouton Enregistrer } } }); //------------Quand on clic sur le bouton Enregistrer------------ btnGoCSV.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { fc_saveCSV.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); //permet de ne sélectionner que les répertoires fc_saveCSV.showSaveDialog(null); //ouvre une boite de dialogue cheminCSV = fc_saveCSV.getSelectedFile() + "\\"; //recupere le chemin + \ try { CaptureColonne(); } catch (IOException e) { e.printStackTrace(); } } }); this.setVisible(true); //On rend visible l'interface graphique } /*--------------------------------FONCTION QUI AJOUTE ECOLE/NIVEAU--------------------------------*/ public static void ajouteEcoleNiveau(Map<String,Ecole> eMap,String autreEcole,String niveau){ if(eMap.get(autreEcole)== null){ //System.out.println("l'ecole n'est pas dans la map"); Ecole newEcole = new Ecole(autreEcole); newEcole.ajoutOccurenceNiveau(niveau); eMap.put(autreEcole,newEcole); } else{ //System.out.println("l'ecole est dans la map"); eMap.get(autreEcole).ajoutOccurenceNiveau(niveau); } } /*--------------------------------FONCTION QUI AFFICHE LES STATS--------------------------------*/ public static void afficheStatistiqueListe(Map<String,Ecole> eMap){ Set<String> cles = eMap.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()){ //parcour la hashMap Object cle = it.next(); //recupere la clé Object valeur = eMap.get(cle); //recupere la valeur try { bw2.write((String)cle+";"); } catch (IOException e) { e.printStackTrace(); } //System.out.println((String)cle); //affiche la clé(CodeEcole) try { bw2.write(((Ecole) valeur).getStatistique()); } catch (IOException e) { e.printStackTrace(); } //affiche les niveaux de l'ecole } } /*-------------------------------- PROGRAMME--------------------------------*/ //----------Partie Traitement Doublon------------ public void CaptureColonne() throws IOException { reader = new CSVReader(new FileReader(fichier), ';','$',1); //ouvre le flux de lecture String [] nextLine; //tableau qui va contenir les colonnes d'une ligne Annee = textField.getText(); //recupere l'année toInt = Integer.parseInt(Annee); //transforme String en Int List<Enregistrement> listeAvecDoublon = new ArrayList<Enregistrement>(); bw = new BufferedWriter(new FileWriter(cheminCSV+"Eleves_"+Annee+".dbf", false)); //flux d'ecriture bw2 = new BufferedWriter(new FileWriter(cheminCSV+"Eleves_Stats_"+Annee+".dbf", true)); bw.write("Nom;Prenom;Niveau;CodeEcole;NomEcole;\n"); bw2.write("CodeEcole;TPS;PS;MS;GS;CP;CE1;CE2;CM1;CM2;TOTAL;\n"); while ((nextLine = reader.readNext()) != null){ Enregistrement Eleve = new Enregistrement(nextLine[0],nextLine[1],nextLine[2],nextLine[5],nextLine[6]); // System.out.println(compt+"Eleve créé !"); listeAvecDoublon.add(Eleve); } int comptDoublon = 0; Map<String,Map<String,List<Enregistrement>>> listeStructure = new HashMap<String,Map<String,List<Enregistrement>>>(); for(Enregistrement ligne : listeAvecDoublon){ // On prend le dossier de la famille if(listeStructure.get(ligne.getNom())== null){ Map<String,List<Enregistrement>> prenomStructure = new HashMap<String,List<Enregistrement>>(); List<Enregistrement> listeDoublon = new ArrayList<Enregistrement>(); listeDoublon.add(ligne); prenomStructure .put(ligne.getPrenom() ,listeDoublon); listeStructure.put(ligne.getNom(),prenomStructure ); bw.write(ligne.getNom()+";"+ligne.getPrenom()+";"+ligne.getNiveau()+";"+ligne.getCodeEcole()+";"+ligne.getNomEcole()+";\n"); } else { Map<String,List<Enregistrement>> prenomStructure = listeStructure .get(ligne.getNom()); // On prend le dossier du prénom dans la famille. if(prenomStructure.get(ligne.getPrenom()) == null){ List<Enregistrement> listeDoublon = new ArrayList<Enregistrement>(); listeDoublon.add(ligne); prenomStructure .put(ligne.getPrenom() ,listeDoublon); bw.write(ligne.getNom()+";"+ligne.getPrenom()+";"+ligne.getNiveau()+";"+ligne.getCodeEcole()+";"+ligne.getNomEcole()+";\n"); } else { prenomStructure.get(ligne.getPrenom()).add(ligne); comptDoublon++; //System.out.println(ligne.getNom()+" "+ligne.getPrenom()+" est en doublon"); } } } JOptionPane.showMessageDialog(null, +comptDoublon+" doublon(s) supprimé(s)","Doublon(s) supprimé(s)", JOptionPane.INFORMATION_MESSAGE); //----------------Partie Statistique---------------- bw.close(); reader.close(); reader2 = new CSVReader(new FileReader(cheminCSV+"Eleves_"+Annee+".dbf"),';','$',1); String [] nextLine2; HashMap<String, Ecole> mapEcoles = new HashMap<String, Ecole>(); //liste d'ecole while ((nextLine2 = reader2.readNext()) != null){ //on ajoute la ligne dans un tableau<Ecole> monEcole = new Ecole(nextLine2[3]); ajouteEcoleNiveau(mapEcoles, nextLine2[3], nextLine2[2]); //ajoute les ecoles dans la map, et ajoute les niveaux } afficheStatistiqueListe(mapEcoles); //ecrit dans le fichier statistique reader2.close(); bw2.close(); JOptionPane.showMessageDialog(null, "Génération terminée ! ","Terminé !", JOptionPane.INFORMATION_MESSAGE); } public static void main(String[] args) { try { //Dès qu'il est lancé... UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); new Main(); //...On lance Main() } catch (Exception e) { e.printStackTrace(); } } }
Code:
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 public class Enregistrement { String Nom; String Prenom; String Niveau; String CodeEcole; String NomEcole; public Enregistrement(String NomE, String PrenomE, String NiveauE, String CodeEcoleE, String NomEcoleE) { Nom = NomE; Prenom = PrenomE; Niveau = NiveauE; CodeEcole = CodeEcoleE; NomEcole = NomEcoleE; } public String getNom() { return Nom; } public String getPrenom() { return Prenom; } public String getNiveau() { return Niveau; } public String getCodeEcole() { return CodeEcole; } public String getNomEcole() { return NomEcole; } }
Code:
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
82
83
84
85
86
87
88
89
90
91
92 import java.util.ArrayList; public class Ecole { protected String codeEcole; public int[] statistique = new int[10]; public static int TPS = 0; public static int PS = 1; public static int MS = 2; public static int GS = 3; public static int CP = 4; public static int CE1 = 5; public static int CE2 = 6; public static int CM1 = 7; public static int CM2 = 8; public static int TOTAL = 9; public Ecole(String eCode){ //System.out.println("\n Création d'une ecole avec parametre !"); codeEcole = eCode; } public void ajoutOccurenceNiveau(String eNiveau){ statistique[TOTAL]+=1; switch (eNiveau) { case "TPS": statistique[TPS]+=1; break; case "PS": statistique[PS]+=1; break; case "MS": statistique[MS]+=1; break; case "GS": statistique[GS]+=1; break; case "CP": statistique[CP]+=1; break; case "CE1": statistique[CE1 ]+=1; break; case "CE2": statistique[CE2]+=1; break; case "CM1": statistique[CM1]+=1; break; case "CM2": statistique[CM2]+=1; break; default: } } //---------------------Accesseurs--------------------------- public String getCodeEcole() //Retourne le code de l'ecole { return codeEcole; } public String getStatistique(){ //retourne les nb d'occurence des niveaux ArrayList<String> listeNiveau = new ArrayList<String>(); listeNiveau.add("TPS"); listeNiveau.add("PS"); listeNiveau.add("MS"); listeNiveau.add("GS"); listeNiveau.add("CP"); listeNiveau.add("CE1"); listeNiveau.add("CE2"); listeNiveau.add("CM1"); listeNiveau.add("CM2"); listeNiveau.add("TOTAL"); StringBuilder sb = new StringBuilder(); for(int i= 0; i<statistique.length;i++){ sb.append(statistique[i]); sb.append(";"); } sb.append("\n"); return sb.toString(); } }
Pour la suite de mon stage je vais devoir faire un site internet, donc je stop java pour le moment.
A plaisir de vous revoir, et encore MERCI
Cordialement,
P4atch
Bonjour, je réutilise ce sujet car j'ai fait quelque modif au programme et j'ai un NullPointerException qui est généré.
Voici ce que fait mon logiciel avec les modifications apportés :
Je dois maintenant extraire le nomEcole qui correspondant au codeEcole d'un fichier(Codes_ecoles.csv) afin d'écrire ce nomEcole dans le fichier Statistique généré.
Je creer maintenant toutes les ecoles en lisant le fichier Code_ecoles.csv
J'ai donc ajouté un parametre à Ecole(), qui est le nom de l'ecole
J'ajoute ces ecoles dans une map
Je lis le fichier qui contient tous les eleves afin d'en extraire le niveau des eleves.
J'incremente le niveau à chaque ligne lu
J'ecris dans le fichier Statistique le codeEcole, nomEcole, et les Statistiques
Je n'ai plus besoin de vérifier si l'ecole est dans la map ou non, puisque je creer toutes les ecoles lors de la lecture de Codes.ecoles.csv.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 /*--------------------------------FONCTION QUI AJOUTE ECOLE/NIVEAU--------------------------------*/ public static void ajouteNiveau(Map<String,Ecole> eMap,String autreEcole,String niveau){ /*if(eMap.get(autreEcole)== null){ //System.out.println("l'ecole n'est pas dans la map"); Ecole newEcole = new Ecole(autreEcole, nomEcole); newEcole.ajoutOccurenceNiveau(niveau); eMap.put(autreEcole,newEcole); } else{ //System.out.println("l'ecole est dans la map");*/ eMap.get(autreEcole).ajoutOccurenceNiveau(niveau); //} }
Cette fonction ne sert plus qu'a incrementer le niveau
Code principal :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 /*--------------------------------FONCTION QUI AFFICHE LES STATS--------------------------------*/ public static void afficheStatistiqueListe(Map<String,Ecole> eMap){ Set<String> cles = eMap.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()){ //parcour la hashMap Object cle = it.next(); //recupere la clé String nomEcole = ((Ecole) cle).getNomEcoles(); //recupere le nom de l'ecole ---- j'ai des doutes sur cette ligne Object valeur = eMap.get(cle); //recupere la valeur try { bw2.write((String)cle+";"+nomEcole+";"); //ecrit dans le fichier le code de l'ecole et le nom de l'ecole } catch (IOException e) { e.printStackTrace(); } try { bw2.write(((Ecole) valeur).getStatistique(toInt)); //ecrit dans le fichier les stats de l'ecole } catch (IOException e) { e.printStackTrace(); } } }
Code:
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 //----------------Partie Statistique---------------- reader2 = new CSVReader(new FileReader(cheminCSV+"Eleves_"+secteur+"_"+Annee+"_"+annee2+".dbf"),';','$',1); //2e flux de lecture readerEcoles = new CSVReader(new FileReader("Codes_ecoles.csv"),';','$',1); //3e flux de lecture -> recupere les noms et code ecoles String [] nextLine2; //stock la ligne lu String [] nextLineEcoles; //stock la ligne lu HashMap<String, Ecole> mapEcoles = new HashMap<String, Ecole>(); //liste d'ecole // 1. J'ajoute toutes les ecoles a la map while ((nextLineEcoles = readerEcoles.readNext()) != null){ Ecole newEcole = new Ecole(nextLineEcoles[0],nextLineEcoles[1]); mapEcoles.put(nextLineEcoles[0], newEcole); } readerEcoles.close(); // 2. J'ajoute les niveaux aux ecoles dans la map while ((nextLine2 = reader2.readNext()) != null){ //on ajoute la ligne dans un tableau if (nextLine2[3].equals("") ) //si il n'y a pas le codeEcole {} //on fait rien else { ajouteNiveau(mapEcoles, nextLine2[3], nextLine2[2]); //incremente les niveaux des ecoles dans la map } } // 3. J'ecris dans le fichier Statistique afficheStatistiqueListe(mapEcoles); //ecrit dans le fichier statistique reader2.close(); bw2.close(); JOptionPane.showMessageDialog(null, "Génération terminée ! ","Terminé !", JOptionPane.INFORMATION_MESSAGE); }
Code:
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95 public class Ecole { protected String codeEcole; protected String nomEcole; public int[] statistique = new int[10]; public static int TPS = 0; public static int PS = 1; public static int MS = 2; public static int GS = 3; public static int CP = 4; public static int CE1 = 5; public static int CE2 = 6; public static int CM1 = 7; public static int CM2 = 8; public static int TOTAL = 9; public Ecole(String eCode, String eNom){ //System.out.println("\n Création d'une ecole avec parametre !"); codeEcole = eCode; nomEcole = eNom; } public void ajoutOccurenceNiveau(String eNiveau){ statistique[TOTAL]+=1; switch (eNiveau) { case "TPS": statistique[TPS]+=1; break; case "PS": statistique[PS]+=1; break; case "MS": statistique[MS]+=1; break; case "GS": statistique[GS]+=1; break; case "CP": statistique[CP]+=1; break; case "CE1": statistique[CE1 ]+=1; break; case "CE2": statistique[CE2]+=1; break; case "CM1": statistique[CM1]+=1; break; case "CM2": statistique[CM2]+=1; break; default: } } //---------------------Accesseurs--------------------------- public String getCodeEcole() //Retourne le code de l'ecole { return codeEcole; } public String getNomEcoles() //Retourne le code de l'ecole { return nomEcole; } public String getStatistique(int toInt){ //retourne les nb d'occurence des niveaux int annee = toInt; int annee2 = annee + 1; ArrayList<String> listeNiveau = new ArrayList<String>(); listeNiveau.add("TPS"); listeNiveau.add("PS"); listeNiveau.add("MS"); listeNiveau.add("GS"); listeNiveau.add("CP"); listeNiveau.add("CE1"); listeNiveau.add("CE2"); listeNiveau.add("CM1"); listeNiveau.add("CM2"); listeNiveau.add("TOTAL"); StringBuilder sb = new StringBuilder(); for(int i= 0; i<statistique.length;i++){ sb.append(statistique[i]); sb.append(";"); } sb.append(annee+"/"+annee2+"\n"); return sb.toString(); } }
Mon probleme : j'ai un NullPointerException a cette ligne :Est-ce que ca veut dire que autreEcole n'est pas dans ma map ?Code:eMap.get(autreEcole).ajoutOccurenceNiveau(niveau);{
EDIT : Je viens de trouver mon probleme : le fichier qu'on m'as fournit "Codes_ecoles.csv" ne contient pas toutes les ecoles de la région ... je suppose que c'est pour ca que j'ai un NullPointerException
Bon, si je rencontre d'autre probleme, je vous recontacterai, sinon dsl pour le dérangement
Il me semblait bien que j'allais avoir des soucis pour récupérer le nom de l'ecole :
Voici comment je pensais le récupérer :Mais j'ai ce message d'erreur qui concerne la ligne 6 :Code:
1
2
3
4
5
6
7
8
9
10
11
12 public static void afficheStatistiqueListe(Map<String,Ecole> eMap){ Set<String> cles = eMap.keySet(); Iterator<String> it = cles.iterator(); while (it.hasNext()){ //parcour la hashMap Object cle = it.next(); //recupere la clé String nomEcole = ((Ecole) cle).getNomEcoles(); //recupere le nom Object valeur = eMap.get(cle); //recupere la valeur try { bw2.write((String)cle+";"+nomEcole+";"); //ecrit dans le fichier le code de l'ecole ET le nom } catch (IOException e) { e.printStackTrace(); }
Code:
1
2 Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to Ecole at Main.afficheStatistiqueListe(Main.java:197)
EDIT : Probleme résolu ^^'
Salut,
Code:
1
2
3
4
5 Iterator<String> it = cles.iterator(); while (it.hasNext()){ //parcour la hashMap Object cle = it.next(); //recupere la clé String nomEcole = ((Ecole) cle).getNomEcoles(); //recupere le nom Object valeur = eMap.get(cle); //recu
- création d'un itérateur de String appelé it
- boucle tant qu'il y a des String dans l'itérateur
- prise du premier String et mis dans une variable cle de type Object (mais l'instance est toujours du String)
- cast en Ecole de cle, donc du String : String et Ecole étant icompatible (String n'étend pas Ecole) : exception
Pourquoi tout passer en Objet, alors que justement le fait de paramétrer la map sert à pouvoir manipuler clef et valeur dans le bon type sans avoir à caster ?
Tout simplement.Code:
1
2
3
4
5 Iterator<String> it = cles.iterator(); while (it.hasNext()){ String cle = it.next(); Ecole valeur = eMap.get(cle); String nomEcole = ecole.getNomEcoles();
Remarque que puisque le but est d'itérer sur les clefs et les valeurs, autant itérer sur l'entrySet :
Ce qui pourrati s'écrire encore plus simplement :Code:
1
2
3
4
5
6 Iterator<Map.Entry<String, Ecoloe>> it = eMap.entrySet().iterator(); while (it.hasNext()){ Map.Entry<String, Ecoloe> entry = it.next(); String cle = entry.getKey(); Ecole ecole= entry.getValeur(); String nomEcole = ecole.getNomEcoles();
Et si la clef ne servait qu'à récupérer la valeur, tu pourrait aussi itérer sur les valeurs :Code:
1
2
3
4
5 for (Map.Entry<String, Ecole> entry : eMap.entrySet()){ String cle = entry.getKey(); Ecole ecole= entry.getValeur(); String nomEcole = ecole.getNomEcoles();
(voir aussi les streams par ailleurs)Code:
1
2
3 for (Ecole ecole : eMap.values()){ String nomEcole = ecole.getNomEcoles();