Fichier .txt vers Vector

[Résolu/Fermé]
Signaler
Messages postés
11
Date d'inscription
vendredi 31 octobre 2008
Statut
Membre
Dernière intervention
22 décembre 2008
-
Messages postés
11
Date d'inscription
vendredi 31 octobre 2008
Statut
Membre
Dernière intervention
22 décembre 2008
-
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

6 réponses

Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
333
Bonsoir,
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,
Messages postés
11
Date d'inscription
vendredi 31 octobre 2008
Statut
Membre
Dernière intervention
22 décembre 2008

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?
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
333
Bonjour.
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,
Messages postés
11
Date d'inscription
vendredi 31 octobre 2008
Statut
Membre
Dernière intervention
22 décembre 2008

ok parfait c'est plus clair! c'est vrai que c'est logique. je vais essayer ca.

merci
Messages postés
11
Date d'inscription
vendredi 31 octobre 2008
Statut
Membre
Dernière intervention
22 décembre 2008

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...?
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
333
Bonsoir,
Effectivement, si ça fonctionnait avant, c'est curieux.
Maintenant que tu crées une nouvelle instance de String pour instancier Air, la date est changée tout le temps donc c'est normal que ça fonctionne, mais si avant ça fonctionnait, j'avoue que je ne comprends pas pourquoi.

Cordialement,
Messages postés
11
Date d'inscription
vendredi 31 octobre 2008
Statut
Membre
Dernière intervention
22 décembre 2008

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++;
Messages postés
11
Date d'inscription
vendredi 31 octobre 2008
Statut
Membre
Dernière intervention
22 décembre 2008

résolu dans un autre post