comment supprimer proprement les doublons d'un tableau d'objet ?

comment supprimer proprement les doublons d'un tableau d'objet ? - Java - Programmation

Marsh Posté le 14-08-2003 à 13:43:57    

comment supprimer proprement les doublons d'un tableau d'objet ?


---------------
heu...
Reply

Marsh Posté le 14-08-2003 à 13:43:57   

Reply

Marsh Posté le 14-08-2003 à 14:15:05    

Tu peux utiliser java.util.Set.


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 18-08-2003 à 10:37:53    

autre chose ?


---------------
heu...
Reply

Marsh Posté le 18-08-2003 à 10:52:14    

donne plus de détails si la réponse de Krueger ne te satisfait pas.  Je pense que ce krueger te propose, c'est changer le container de manière à ce que tu ne puisses pas avoir de doublons.
 
Maintenant si tu as ce tableau en paramètre et que tu ne peux pas le changer, alors sa solution n'est pas valide.
 
De manière générale il ne faut pas t'attendre à des réponses fleuves avec si peux de détails. Toute solution dépend de son environnement.
 
Par exemple, tu peux redéfinir la méthode equals() des objets qui sont dans ton tableau et utiliser un truc du genre
 
if (!moncont.contains(monobject)  
   moncont.add(monobject);
 
mais bon ca reviens au meme que d'utiliser Set.
 
Bref, donne des détails


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

Marsh Posté le 18-08-2003 à 10:56:50    

sauf que pour un Set ce serait plutot hashCode ou un Comparator à implémenter  :whistle:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 18-08-2003 à 11:03:57    

benou a écrit :

sauf que pour un Set ce serait plutot hashCode ou un Comparator à implémenter  :whistle:  


 
vi vi desolaid  :ange:


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

Marsh Posté le 18-08-2003 à 12:13:19    

En fait, dans l'interface java.util.List il y a la méthode toArray(Object[]) qui retourne un tableau dont le type correspond à celui spécifié en paramètre.
D'un autre côté, l'interface java.util.Set permet de gérer un ensemble d'objets sans doublons, comme ça a été dit ci-dessus.
Pour le mapping tableau d'objet vers Collection, la méthode asList(Object[]) de la classe java.util.Arrays te retourne un objet java.util.List (j'avais oublié d'en parler, désolé :whistle: ).
 
Au final, on aurait eu un code du genre :
1. Construire une liste à partir du tableau.
2. Construire un ensemble à partir de cette liste.
3. Extraire de cet ensemble le tableau sans les doublons ! :)
 
C'est la méthode que je souhaitais proposer implicitement. J'ai cru que tu aurais plus cherché, mais bon... [:spamafote]


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 18-08-2003 à 12:35:49    

dsl pour le manque de presision, c vrai que c un peu light.
 
en fait je passe en parametre un tableau d'object ( qui sont des objet noeud avec plein de variable, dont x et y )
 
dans ce tableau il peut y avoir plusieur fois le meme noeud ( meme x et y mais pas meme instance)
 
moi je ne veux pas de c doublons.
 
La j'ai une methode qui fonctionne, j'ajout dans mon tableau de sorti mes noeuds en verifiant kil n'y sont pas deja ( un for et un if a la con à remplacé pkoi pas par un comparator).
 
 
Sinon je viens d'avoir une idée, j'ajoute tout mes noeud dans un tableau [x][y] avec en x et y les x et y de mes noeuds, et je retourne le tableau sans les cases null.
 
je vais peut etre faire ca
merci


Message édité par xtoune le 18-08-2003 à 12:36:10

---------------
heu...
Reply

Marsh Posté le 18-08-2003 à 12:39:39    

dans ton objet noeud tu fais la chose suivante
 

Code :
  1. public class Node {
  2.   private int x;
  3.   private int y;
  4.   public boolean equals(Object o) {
  5.      if (o == this) return true;
  6.      if (!(o instanceof Node)) return false;
  7.      final Node node = (Node) o;
  8.      if ((node.x == this.x) && (node.y == this.y))
  9.          return true;
  10.      else
  11.          return false;
  12.   }
  13. }


 
avec ca tu peux utiliser par exemple une ArrayList à la place d'un tableau et faire
 

Code :
  1. if (!maList.contains(monobjet))
  2.     maList.add(monobject);


 
sachant que monobjet sera tjrs du type node


Message édité par darklord le 18-08-2003 à 12:52:24

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

Marsh Posté le 18-08-2003 à 12:48:55    

ok ok  
merci  
 
juste une erreur d'initation :
 
c node.x et node.y et non pas o.x et o.y


---------------
heu...
Reply

Marsh Posté le 18-08-2003 à 12:48:55   

Reply

Marsh Posté le 18-08-2003 à 12:52:09    

xtoune a écrit :

ok ok  
merci  
 
juste une erreur d'initation :
 
c node.x et node.y et non pas o.x et o.y


 
en effet :o


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

Marsh Posté le 18-08-2003 à 12:53:30    

xtoune a écrit :

c node.x et node.y et non pas o.x et o.y


oui.
 
dark, il sert à quoi ton "final" quand tu déclares la variable node ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 18-08-2003 à 14:24:12    

benou a écrit :


dark, il sert à quoi ton "final" quand tu déclares la variable node ?


 

Citation :


Declare method arguments final if they are not modified in the method. In general declare all variables final if they are not modified after being initialized or set to some value.


 
http://www.javaperformancetuning.com/tips/final.shtml


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

Marsh Posté le 18-08-2003 à 14:34:21    

mouais c'est ce que j'imaginais mais ca sert à quoi concrétement ? le compilo est capable de voir si y a une autre affectation => il peut optimiser lui même ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 18-08-2003 à 14:44:38    

benou a écrit :

mouais c'est ce que j'imaginais mais ca sert à quoi concrétement ?  


 
à optimiser le code, sachant qu'equals a des chances d'etre appellés très souvent (-> qd tu fais contains sur une arraylist il appelle equals sur sa collection qd meme ...)
 


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

Marsh Posté le 18-08-2003 à 14:47:19    

une autre question vite fait en passant, by the way :
 
 
g une methode :  
 

Code :
  1. public void valueChanged ( ListSelectionEvent evt ) {
  2. Object src = evt.getSource();
  3. if ( src.equals( playList ) && playList.hasFocus() ) {
  4. noeudList.setSelectedIndices(playList.getSelectedIndices());
  5. }
  6. if ( src.equals( noeudList ) ) {
  7. cadreVisu.drawGrille();
  8. }
  9. }


 
ca marche bien qd je selectionne un à un les element de playList.
Le pb c quand je selectionne par un ctrl-a ( ou avec maj) :
 
ctrl-a : un evenement déclenché donc un appel de valueChanged avec comme source playlist.
par contre si mon ctrl-a à selectionné 50 element, j'ai 50 évenement donc 50 appelle de valueChanged avec comme source noeudList....  
 
 
pour l'instant Pour contourner le pb j'utilise une variable qui  decompte le nombre d'évenement ( ici 50,49,... et à 0 je fais mon traitement ) :-(
 
mais c pas le top, vous connaissez la solution ?


---------------
heu...
Reply

Marsh Posté le 18-08-2003 à 15:55:18    

Pour l'instant je ne vois rien d'autre qu'un thread qui reçoit les requêtes de mise à jour pour les bufferiser et les traiter simultanément s'il y en a plusieurs dans un intervalle de temps très court.
J'ai essayé de trouver un moyen de changer le comportement du ListSelectionListener dans le cas où il y a plusieurs nouvelles sélections simultanées, mais en vain. [:spamafote]


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 18-08-2003 à 17:21:13    

moi j'aimerai bien pouvoir vider le buffer qui contient les evenement provenant de NoeudList par exemple


---------------
heu...
Reply

Marsh Posté le 18-08-2003 à 17:27:05    

xtoune a écrit :

moi j'aimerai bien pouvoir vider le buffer qui contient les evenement provenant de NoeudList par exemple


 
ouvre un nouveau sujet avec un titre explicite. Ca n'a rien à voir avec ta question initiale


Message édité par darklord le 18-08-2003 à 17:27:11

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

Sujets relatifs:

Leave a Replay

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