Utilisation d'une ArrayList

Utilisation d'une ArrayList - Java - Programmation

Marsh Posté le 02-12-2002 à 16:08:40    

Bonjour,
j'ai un petit problème pour remplir une ArrayList.
J'ai X fois le dernier element insere et ensuite mon Collections.sort bloque le traitement ...
---------------------------------------
Code :
Dans une boucle j'ai
 versionLog.setLength(0);
 ....
 listVL.add(versionLog); //versionLog est un StringBuffer
 
----------------------------------  
 A la sortie de la boucle :
 Collections.sort(listVL);
 


---------------
Evite les personnes arrogantes et vulgaires, elles sont un tourment pour l'esprit.
Reply

Marsh Posté le 02-12-2002 à 16:08:40   

Reply

Marsh Posté le 02-12-2002 à 16:12:24    

T'as lu la doc ?
Pour appliquer à une List, la méthode sort de Collections, il faut que tous les éléments de la liste implémentent l'interface Comparable ! Tu vois bien que StringBuffer l'implémente pas.
Sinon, tu peux utiliser plutot

public static void sort(List list,
                        Comparator c)

de la classe Collections...

Reply

Marsh Posté le 02-12-2002 à 16:27:37    

El_Gringo a écrit a écrit :

T'as lu la doc ?
Pour appliquer à une List, la méthode sort de Collections, il faut que tous les éléments de la liste implémentent l'interface Comparable ! Tu vois bien que StringBuffer l'implémente pas.
Sinon, tu peux utiliser plutot

public static void sort(List list,
                        Comparator c)

de la classe Collections...




Pour le Collections.Sort -> ok je vais regarder.
Par contre, pour la premiere partie de ma question, est-ce-que tu as une idée ?


---------------
Evite les personnes arrogantes et vulgaires, elles sont un tourment pour l'esprit.
Reply

Marsh Posté le 02-12-2002 à 16:35:06    

Bah ça viens surement de ton algo : debug !

Reply

Marsh Posté le 02-12-2002 à 16:38:53    

El_Gringo a écrit a écrit :

Bah ça viens surement de ton algo : debug !




A priori, en convertissant mon StringBuffer en String, tout à l'air d'être rentré dans l'ordre ...
Y'aurait mieux à faire ?
Sinon Merci (si oui aussi d'ailleurs)


---------------
Evite les personnes arrogantes et vulgaires, elles sont un tourment pour l'esprit.
Reply

Marsh Posté le 02-12-2002 à 16:59:37    

PERSEPOLIS a écrit a écrit :

 
A priori, en convertissant mon StringBuffer en String, tout à l'air d'être rentré dans l'ordre ...
Y'aurait mieux à faire ?
Sinon Merci (si oui aussi d'ailleurs)




 
ha mon avis, c ce que t'as de mieux à faire, c clair !

Reply

Marsh Posté le 02-12-2002 à 17:59:44    

Bah, si tu réfléchis 5 minutes, tu te rendras compte que c'est tout à fait normal, comme comportement : tu fais :
 

Code :
  1. while(condition) {
  2. versionLog.setLength(0);
  3. ....
  4. listVL.add(versionLog);
  5. }

 
 
donc, tu ajoutes à chaque fois à ton arraylist, une référence vers une même instance de StringBuffer : donc, quand tu accèdes à tes éléments, tu obtiens toujours la même instance!!
 
En revanche, si tu fais : listVL.add(versionLog.toString());
 
ben tu ajoutes dans ta liste une nouvelle instance de String, qui contient le contenu de versionLog au moment de l'appel..
 
C'est pas tout de trouver des solutions, il faut aussi piger pourquoi elles marchent!

Reply

Marsh Posté le 03-12-2002 à 09:33:45    

gfive a écrit a écrit :

Bah, si tu réfléchis 5 minutes, tu te rendras compte que c'est tout à fait normal, comme comportement : tu fais :
 

Code :
  1. while(condition) {
  2. versionLog.setLength(0);
  3. ....
  4. listVL.add(versionLog);
  5. }

 
 
donc, tu ajoutes à chaque fois à ton arraylist, une référence vers une même instance de StringBuffer : donc, quand tu accèdes à tes éléments, tu obtiens toujours la même instance!!
 
En revanche, si tu fais : listVL.add(versionLog.toString());
 
ben tu ajoutes dans ta liste une nouvelle instance de String, qui contient le contenu de versionLog au moment de l'appel..
 
C'est pas tout de trouver des solutions, il faut aussi piger pourquoi elles marchent!




Fo croire Ke C pas donne à tous le monde de reflechir comme toi ???  :fou:


Message édité par persepolis le 03-12-2002 à 09:34:21

---------------
Evite les personnes arrogantes et vulgaires, elles sont un tourment pour l'esprit.
Reply

Marsh Posté le 03-12-2002 à 10:26:11    

bah, c'est pas une manière de réfléchir!!!! C'est le comportement NORMAL..Enfin, je sais pas, moi!! Réfléchit 2 secondes : tu ajoutes à chaque position de ton arraylist un MEME OBJET!!! Il est pas dupliqué lors de l'ajout...donc, si tu le modifies, tu as beau y accéder par la première ou la dernière position de ta liste, ben tu accèdes toujours au même objet!!

Reply

Marsh Posté le 03-12-2002 à 10:31:49    

gfive a écrit a écrit :

bah, c'est pas une manière de réfléchir!!!! C'est le comportement NORMAL..Enfin, je sais pas, moi!! Réfléchit 2 secondes : tu ajoutes à chaque position de ton arraylist un MEME OBJET!!! Il est pas dupliqué lors de l'ajout...donc, si tu le modifies, tu as beau y accéder par la première ou la dernière position de ta liste, ben tu accèdes toujours au même objet!!




T'as tout à fait raison mais c'est vrai que j'ai encore du mal à refléchir en terme d'objet ...
Une leçon de plus... :sarcastic:


---------------
Evite les personnes arrogantes et vulgaires, elles sont un tourment pour l'esprit.
Reply

Marsh Posté le 03-12-2002 à 10:31:49   

Reply

Marsh Posté le 03-12-2002 à 10:47:55    

gfive a écrit a écrit :

bah, c'est pas une manière de réfléchir!!!! C'est le comportement NORMAL..Enfin, je sais pas, moi!! Réfléchit 2 secondes : tu ajoutes à chaque position de ton arraylist un MEME OBJET!!! Il est pas dupliqué lors de l'ajout...donc, si tu le modifies, tu as beau y accéder par la première ou la dernière position de ta liste, ben tu accèdes toujours au même objet!!




gfive> Pour la défense de persepolis, raisonner en termes d'objets partagés n'est pas du tout naturel. On y vient, certes, mais quand on vient (en particulier) du monde C++, c'est très déroutant au début.
 
J'ai même connu une époque (désormais révolue) où la condition suivante était toujours fausse en Java :

Code :
  1. String  s = "toto";
  2. if (s == "toto" ) {
  3.    ...
  4. }


parce que la chaîne littérale "toto" était équivalente à l'expression new String("toto" )...


Message édité par BifaceMcLeOD le 03-12-2002 à 10:50:18
Reply

Marsh Posté le 03-12-2002 à 10:57:17    

le == pour comparer les String c'est mal !!!  :o

Reply

Marsh Posté le 03-12-2002 à 10:59:03    

benou a écrit a écrit :

le == pour comparer les String c'est mal !!!  :o  




 
ouais qd meme :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 03-12-2002 à 11:17:37    

c pas que c mal le == avec les String, c que ca marche pas.
J aime bien dire quand le code y marche pas  :D  
 
 [:len22]

Reply

Marsh Posté le 03-12-2002 à 11:17:40    

C'est une erreur que quasiment tous les débutants Java faisaient il y a quelques années. Et comme par hasard, ils venaient tous du monde C/C++.
 
Et pourquoi écrivaient-ils ces lignes ? Parce qu'en C++, on mélange allègrement identité et valeur des objets, concepts que Java a clairement séparés. Et on en revient précisément à la question première de ce topic...  :whistle:
 
edit> Je vous signale qu'avec les versions actuelles de Java, le code suivant affiche toujours "Vrai".

Code :
  1. public class Toto {
  2.   public static void main(String[] args) {
  3.     String s = "toto";
  4.     if (s == "toto" ) {
  5.       System.out.println("Vrai" );
  6.     }
  7.     else {
  8.       System.out.println("Faux" );
  9.     }
  10.   }
  11. }


Message édité par BifaceMcLeOD le 03-12-2002 à 11:22:16
Reply

Marsh Posté le 03-12-2002 à 11:26:04    

bha ouais on sait ! Mais c'est un "coup de bol" est c'est loin d'être garantie !
 
c'est juste parce que les objets de type String sont mit en cache.

Reply

Marsh Posté le 03-12-2002 à 11:32:44    

benou a écrit a écrit :

bha ouais on sait ! Mais c'est un "coup de bol" est c'est loin d'être garantie !
 
c'est juste parce que les objets de type String sont mit en cache.




 
...uniquement ceux qui sont construit à partir d'une chaine en dur, style "toto", non ?
parce que ça :

Code :
  1. public class Toto {
  2. public static void main(String[] args) {
  3.    String s = new String ("toto" );
  4.    if (s == "toto" ) {
  5.      System.out.println("Vrai" );
  6.    }
  7.    else {
  8.      System.out.println("Faux" );
  9.    }
  10. }
  11. }


 
ça marche pas, si !?

Reply

Marsh Posté le 03-12-2002 à 11:51:49    

non, ca marche pas : t'utilise un new donc c'est réellement une nouvelle instance mais y a pas que les chaines en dur qui sont cachées :
 

Code :
  1. package test;
  2. public class TestString {
  3.    public static void main (String[] args) {
  4.       System.out.println("toto".equals("to" + "to" ));
  5.       System.out.println("toto".equals(new StringBuffer().append('t').append('o').append("to" ).toString()));   
  6.    }
  7. }


ca ca affiche  


true
true


Reply

Marsh Posté le 03-12-2002 à 16:01:32    

Avec .equals -> pas de surprise  ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed