Fichier .txt vers Vector
Résolu
Kasuba
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
Kasuba Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
Kasuba Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
j'ai un petit soucis qui me prend de plus en plus la tête.
voici la fonction qui me pose problème (test et airFeatures sont des Vector):
public static Vector read() throws NoSuchElementException,FileNotFoundException, IOException{
Reader r = new FileReader(file);
BufferedReader br = new BufferedReader(r);
while ( (line = br.readLine()) != null ){
StringTokenizer st = new StringTokenizer(line, " ");
date = st.nextToken(); //prend le premier mot de la ligne
hour = st.nextToken(); // prend le 2e mot de la ligne
temperature= st.nextToken();
hr = st.nextToken();
air=new Air(date,hour,temperature,hr);
test.add(date);
System.out.println(air.getTemperature() + " "+ air.getHr() +" ");
airFeatures.add(air);
if((date).compareTo(endDate)==0 && (hour).compareTo(endHour)==0{
r.close();
return airFeatures;
}
}
}
___________________________________________________________________________________________
fichier texte :
09/10/2006 3:00 6,3 98%
10/10/2006 1:00 6,4 85%
10/10/2006 2:00 6,4 99%
10/10/2006 3:00 6,5 76%
12/12/2006 23:00 7,6 89%
___________________________________________________________________________________________
j'ai donc une classe Air qui a comme attributs: date, hour, temperature, hr.
l'affichage que je demande de faire dans cette fonction fonctionne parfaitement.
les donnée de test sont correctes, ce vector contient bien toutes les dates différentes du fichier texte dans l'ordre.
mais lorsque je je vérifie le contenu de airFeatures (rempli d'objet "Air") à l'aide d'une boucle while dans le if, en tentant de récupérer par exemple toutes les temperatures, je remarque que toute les températures affichées sont les mêmes et correspondent à la dernière température (7,6)... idem pour les autres atributs. je comprend vraiment pas!
j'ai déja réaliser cela dans un autre programme d'une autre manière certe mais je ne vois pas pq ça ne fonctionne pas ici.
si qqun peut m'aider, merciiii
j'ai un petit soucis qui me prend de plus en plus la tête.
voici la fonction qui me pose problème (test et airFeatures sont des Vector):
public static Vector read() throws NoSuchElementException,FileNotFoundException, IOException{
Reader r = new FileReader(file);
BufferedReader br = new BufferedReader(r);
while ( (line = br.readLine()) != null ){
StringTokenizer st = new StringTokenizer(line, " ");
date = st.nextToken(); //prend le premier mot de la ligne
hour = st.nextToken(); // prend le 2e mot de la ligne
temperature= st.nextToken();
hr = st.nextToken();
air=new Air(date,hour,temperature,hr);
test.add(date);
System.out.println(air.getTemperature() + " "+ air.getHr() +" ");
airFeatures.add(air);
if((date).compareTo(endDate)==0 && (hour).compareTo(endHour)==0{
r.close();
return airFeatures;
}
}
}
___________________________________________________________________________________________
fichier texte :
09/10/2006 3:00 6,3 98%
10/10/2006 1:00 6,4 85%
10/10/2006 2:00 6,4 99%
10/10/2006 3:00 6,5 76%
12/12/2006 23:00 7,6 89%
___________________________________________________________________________________________
j'ai donc une classe Air qui a comme attributs: date, hour, temperature, hr.
l'affichage que je demande de faire dans cette fonction fonctionne parfaitement.
les donnée de test sont correctes, ce vector contient bien toutes les dates différentes du fichier texte dans l'ordre.
mais lorsque je je vérifie le contenu de airFeatures (rempli d'objet "Air") à l'aide d'une boucle while dans le if, en tentant de récupérer par exemple toutes les temperatures, je remarque que toute les températures affichées sont les mêmes et correspondent à la dernière température (7,6)... idem pour les autres atributs. je comprend vraiment pas!
j'ai déja réaliser cela dans un autre programme d'une autre manière certe mais je ne vois pas pq ça ne fonctionne pas ici.
si qqun peut m'aider, merciiii
A voir également:
- Fichier .txt vers Vector
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
6 réponses
Bonsoir,
Il faut que tu crées une nouvelle instance des attributs qui composent Air :
En fait, on va prendre un exemple plus simple pour expliquer : tu as une classe A possédant un attribut att.
Quand tu fais :
A a = new A(5); l'attribut att pointe sur la valeur 5
Ensuite, quand tu ajoutes ton instance a dans un vector, il n'y a aucun copie qui est faite, le vecteur a simplement l'adresse de ton objet. Aussi, si tu modifies ton instance a, le vecteur ne s'en rend pas compte, et t'affiche donc les nouvelles valeurs.
Cordialement,
Il faut que tu crées une nouvelle instance des attributs qui composent Air :
while ( (line = br.readLine()) != null ){ StringTokenizer st = new StringTokenizer(line, " "); String date = new String(); date = st.nextToken(); //prend le premier mot de la ligne String hour = new String(); hour = st.nextToken(); // prend le 2e mot de la ligne String temperature = new String(); temperature= st.nextToken(); String hr = new String(); hr = st.nextToken(); air=new Air(date,hour,temperature,hr); test.add(date); System.out.println(air.getTemperature() + " "+ air.getHr() +" "); airFeatures.add(air); if((date).compareTo(endDate)==0 && (hour).compareTo(endHour)==0{ r.close(); return airFeatures; }
En fait, on va prendre un exemple plus simple pour expliquer : tu as une classe A possédant un attribut att.
Quand tu fais :
A a = new A(5); l'attribut att pointe sur la valeur 5
Ensuite, quand tu ajoutes ton instance a dans un vector, il n'y a aucun copie qui est faite, le vecteur a simplement l'adresse de ton objet. Aussi, si tu modifies ton instance a, le vecteur ne s'en rend pas compte, et t'affiche donc les nouvelles valeurs.
Cordialement,
mmm. et ce que vous avez modifié est sensé résoudre le problème? car cela ne fonctionne toujours pas. je suis donc dans une autre classe que la classe Air pour remplir le vector. j'ai déja fait la chose suivante dans un autre programme:
airFeatures.add(new Air(date,hour,temperature,hr))
et cela fonctionnait très bien, je ne vois pas ou est le problème, chaque élément du vector point vers l'objet ajouté et chaque objet du vector possède ses attribut non?
airFeatures.add(new Air(date,hour,temperature,hr))
et cela fonctionnait très bien, je ne vois pas ou est le problème, chaque élément du vector point vers l'objet ajouté et chaque objet du vector possède ses attribut non?
Bonjour.
Je ne sais pas si je me suis bien exprimé.
Si tu fais :
Ton vecteur va contenir deux compteurs dont l'attribut est 3.
Si par contre tu fais :
Ici ton vecteur contiendra bien un compteur dont l'attribut vaudra 5, et le second vaudra 3.
Cordialement,
Je ne sais pas si je me suis bien exprimé.
Si tu fais :
Vector<Compteur> v = new Vector<Compteur>(); Integer i = new Integer(5); Compteur c = new Compteur(i); v.add(c); i = new Integer(3); Compteur c2 = new Compteur(i); v.add(c2);
Ton vecteur va contenir deux compteurs dont l'attribut est 3.
Si par contre tu fais :
Vector<Compteur> v = new Vector<Compteur>(); Integer i = new Integer(5); Compteur c = new Compteur(i); v.add(c); Integer i2 = new Integer(3); Compteur c2 = new Compteur(i2); v.add(c2);
Ici ton vecteur contiendra bien un compteur dont l'attribut vaudra 5, et le second vaudra 3.
Cordialement,
j'ai une autre erreur maintenant, mais ce serait un autre débat. par contre, pourquoi (dans la fonction de mon 1er message) cela fonctionne t'il avec le vector test? tout les élément devraient aussi pointé vers le même date...?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
je pensais résoudre le problème en remplaçant mes attribut date hour,... par des vector dont chaque élément contiendra un nouveau string lu ds le fichier. je pense donc qu'il n'y a plus de problème de pointeur, mais je constate le même provlème. :s
voila ce que j'ai maintenant mis dans ma boucle while:
StringTokenizer st = new StringTokenizer(line, " ");
date.add(st.nextToken()); //prend le premier mot de la ligne
hour.add(st.nextToken()); // prend le 2e mot de la ligne
temperature.add(st.nextToken());
hr.add(st.nextToken());
airFeatures.add(new Air((String)(date.get(i)) , (String)(hour.get(i)),(String)(temperature.get(i)),(String)(hr.get(i)) ) );
if ( ( ( (Air)airFeatures.get(i)).getDate() ).compareTo(endDate) ==0 && ( ( (Air)airFeatures.get(i)).getHour() ).compareTo(endHour) ==0 ){
r.close();
return airFeatures;
}
i++;
voila ce que j'ai maintenant mis dans ma boucle while:
StringTokenizer st = new StringTokenizer(line, " ");
date.add(st.nextToken()); //prend le premier mot de la ligne
hour.add(st.nextToken()); // prend le 2e mot de la ligne
temperature.add(st.nextToken());
hr.add(st.nextToken());
airFeatures.add(new Air((String)(date.get(i)) , (String)(hour.get(i)),(String)(temperature.get(i)),(String)(hr.get(i)) ) );
if ( ( ( (Air)airFeatures.get(i)).getDate() ).compareTo(endDate) ==0 && ( ( (Air)airFeatures.get(i)).getHour() ).compareTo(endHour) ==0 ){
r.close();
return airFeatures;
}
i++;