Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1451 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Utilisation d'une ArrayList

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Utilisation d'une ArrayList

n°259007
persepolis
Posté le 02-12-2002 à 16:08:40  profilanswer
 

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.
mood
Publicité
Posté le 02-12-2002 à 16:08:40  profilanswer
 

n°259012
El_gringo
Posté le 02-12-2002 à 16:12:24  profilanswer
 

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...

n°259039
persepolis
Posté le 02-12-2002 à 16:27:37  profilanswer
 

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.
n°259047
El_gringo
Posté le 02-12-2002 à 16:35:06  profilanswer
 

Bah ça viens surement de ton algo : debug !

n°259050
persepolis
Posté le 02-12-2002 à 16:38:53  profilanswer
 

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.
n°259097
El_gringo
Posté le 02-12-2002 à 16:59:37  profilanswer
 

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 !

n°259154
gfive
Posté le 02-12-2002 à 17:59:44  profilanswer
 

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!

n°259497
persepolis
Posté le 03-12-2002 à 09:33:45  profilanswer
 

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.
n°259531
gfive
Posté le 03-12-2002 à 10:26:11  profilanswer
 

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!!

n°259536
persepolis
Posté le 03-12-2002 à 10:31:49  profilanswer
 

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.
mood
Publicité
Posté le 03-12-2002 à 10:31:49  profilanswer
 

n°259561
BifaceMcLe​OD
The HighGlandeur
Posté le 03-12-2002 à 10:47:55  profilanswer
 

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
n°259570
benou
Posté le 03-12-2002 à 10:57:17  profilanswer
 

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

n°259572
darklord
You're welcome
Posté le 03-12-2002 à 10:59:03  profilanswer
 

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
n°259591
Prince2Lu
Posté le 03-12-2002 à 11:17:37  profilanswer
 

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]

n°259592
BifaceMcLe​OD
The HighGlandeur
Posté le 03-12-2002 à 11:17:40  profilanswer
 

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
n°259600
benou
Posté le 03-12-2002 à 11:26:04  profilanswer
 

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.

n°259604
El_gringo
Posté le 03-12-2002 à 11:32:44  profilanswer
 

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 !?

n°259619
benou
Posté le 03-12-2002 à 11:51:49  profilanswer
 

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


n°259813
buzvolio
Posté le 03-12-2002 à 16:01:32  profilanswer
 

Avec .equals -> pas de surprise  ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Utilisation d'une ArrayList

 

Sujets relatifs
Pb d'utilisation des classes enveloppes + algo de triTomcat 4 - Paramétrage pour une utilisation en production
Utilisation de javax.comm (accès au port série, //, ...) + DEPRECATEutilisation d un formulaire avec interaction d une base odb
utilisation de sscanf: :/Utilisation de valgrind : comprendre les messages
[C++] De la bonne utilisation de newC++ Builder : Utilisation des DBComboBox
[PHP] Utilisation de file_exists : DONE.Utilisation invalide de la clause GROUP
Plus de sujets relatifs à : Utilisation d'une ArrayList


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR