IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

[ArrayList] Intervertir deux objets


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut [ArrayList] Intervertir deux objets
    Bonjour à tous !

    Avant tout je sais qu'on peut trouver beaucoup de réponse à cette requête sur le net, mais la mienne est un peu particulière

    Alors voilà mon souci :

    J'ai besoin de réorganiser un ArrayList<MaClasse> d'une façon particulière. Dans MaClasse, j'ai un champ "date", et je voudrai réorganiser cette ArrayList selon ces dates. Sur une autre partie du forum, un gentil utilisateur m'avait gentiment mis sur la voie (à la suite d'une autre question) en me donnant un gentil lien. En fait, c'était pour initialiser un AbstractTableModel, mais ça n'a pas vraiment d'importance...
    Donc j'ai récupéré une partie que j'ai adapté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		int x;
    		MaClasse temp;
    		for(int a = 1 ; a < alMaClasse.size() ; a++)//alMaClasse c'est l'ArrayList que je souhaite "ranger"
    		{
    			x = a;
    			while(x > 0 && (alMaClasse.get(x-1).getDate().compareTo(alMaClasse.get(x).getDate()) > 0))
    			{
    				temp = alMaClasse.get(x);
    				alMaClasse.set(x, alMaClasse.get(x-1));
    				alMaClasse.set(x-1, temp);
    				x--;
    			}
    		}
    Sauf que, je ne l'ai pas testé, mais je sais que ça ne marchera pas
    En effet, comme Java fonctionne par adresse (je ne connais pas le terme exact ), ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    temp = alMaClasse.get(x);
    alMaClasse.set(x, alMaClasse.get(x-1));
    alMaClasse.set(x-1, temp);
    vont juste faire pointer "temp" vers alMaClasse.get(x), etc... et à la fin, je vais obtenir temp = alMaClasse.get(x) = alMaClasse.get(x-1)

    D'habitude, quand je dois dupliquer une classe, j'utilise "clone()", mais là, compte tenu du nombre de champs dans MaClasse, qui sont eux-mêmes des autres classes, j'aimerai autant éviter ...


    Donc ma question : suis-je obligé d'implémenter "clone()" de l'interface Clonneable, et ça pour MaClasse, et toutes les sous-classes qui la composent, ou bien y a-t-il un moyen plus rapide ? J'ai cherché sur Internet, mais à chaque fois je tombe sur des exemples avec des ArrayList de types "simples" (String, int, ...)

    En espérant que quelqu'un puisse m'aider

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Alors déjà tout cela est complètement inutile si ce n'est pas un exercice.
    Pour trier une List, on utilise Collections.sort() avec un Comparator adéquat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MaClasseDateComparator implements Comparator<MaClasse> {
     
      @Override
      public int compare(MaClasse a, MaClasse b) {
        return a.getDate().compareTo(b.getDate());
      }
     
    }


    Ceci étant dit,

    Citation Envoyé par Nafnlaus Voir le message
    Sauf que, je ne l'ai pas testé, mais je sais que ça ne marchera pas
    Cela marche parfaitement.

    Citation Envoyé par Nafnlaus Voir le message
    En effet, comme Java fonctionne par adresse (je ne connais pas le terme exact ), ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    temp = alMaClasse.get(x);
    alMaClasse.set(x, alMaClasse.get(x-1));
    alMaClasse.set(x-1, temp);
    vont juste faire pointer "temp" vers alMaClasse.get(x)
    Oui...

    Citation Envoyé par Nafnlaus Voir le message
    , etc...
    Mais encore ? Quoi d'autre à part temp ?

    Citation Envoyé par Nafnlaus Voir le message
    et à la fin, je vais obtenir temp = alMaClasse.get(x) = alMaClasse.get(x-1)
    ... Non.
    Quel est le raisonnement précis qui t'a amené à penser ça ?
    À te lire, les appels à set() n'ont aucun effet sur ce que donneront les appels à get(), donc ne servent à rien, et à ce moment-là c'est pas ce code qui ne marche pas, ce sont les List.
    ... Et les List marchent très bien, donc tu t'es trompé quelque part.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Quel est le raisonnement précis qui t'a amené à penser ça ?
    À te lire, les appels à set() n'ont aucun effet sur ce que donneront les appels à get(), donc ne servent à rien, et à ce moment-là c'est pas ce code qui ne marche pas, ce sont les List.
    Dans ma tête :
    - temp va pointer sur alMaClasse.get(x)
    - alMaClasse.get(x) va pointer sur alMaClasse.get(x-1)
    - alMaClasse.get(x-1) va pointer sur temp

    Donc normalement, get(x-1) va pointer sur temp, qui lui même pointe sur get(x), qui lui même pointe sur temp, non ?

    Mais quoi qu'il en soit, tu as raison, je devrais simplement utiliser un comparateur, ça sera moins chiant, et sourtout prévu pour... Mais j'y avais pas pensé
    J'ai trouvé ce qui faut dans la FAQ, donc je vais voir tout ça, merci

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Nafnlaus Voir le message
    Dans ma tête :
    - temp va pointer sur alMaClasse.get(x)
    Sur ce que alMaClasse.get(x) renvoie au moment où tu l'appelles, oui.

    Citation Envoyé par Nafnlaus Voir le message
    - alMaClasse.get(x) va pointer sur alMaClasse.get(x-1)
    Vers ce qui lui a été donné avec le set(), qui est donc ce que alMaClasse.get(x-1) renvoyait au moment où le set(x) a été appelé, oui.

    Citation Envoyé par Nafnlaus Voir le message
    - alMaClasse.get(x-1) va pointer sur temp
    Sur ce qui est pointé par temp.

    Citation Envoyé par Nafnlaus Voir le message
    Donc normalement, get(x-1) va pointer sur temp, qui lui même pointe sur get(x), qui lui même pointe sur temp, non ?
    L'appel à set(x) a changé ce que renverra l'appel à get(x). Mais cela n'a absolument pas changé ce vers quoi temp pointe. Normal puisque temp n'a rien à voir avec les get() et set().

    Avant l'appel à set(x), temp et get(x) pointaient vers la même chose, puisque temp a été défini pour pointer vers ce vers quoi pointe get(x).
    Après cet appel, ce n'est plus le cas, puisque get(x) ne pointe plus vers la même chose.

    Citation Envoyé par Nafnlaus Voir le message
    J'ai trouvé ce qui faut dans la FAQ, donc je vais voir tout ça, merci
    La FAQ ne donne pas d'exemple avec Comparator, c'est pourquoi je t'en ai défini un.
    Bon courage.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Par défaut
    C'est mieux d'utiliser Comparator ?

    Pour l'instant, j'ai ajouter dans MaClasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MaClasse implements java.lang.Comparable{
    //...
    	@Override
    	public int compareTo(Object other) {
    		return this.getDate().compareTo(((MaClasse) other).getDate);
    	}
    Et j'ai remplacé les boucles pour le tri par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(alAff);
    A ton avis, ça suffira ? (je ne peux pas encore tester, je n'ai pas un jeu d'essai assez important...)

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Nafnlaus Voir le message
    C'est mieux d'utiliser Comparator ?
    Ça dépend. Si c'est dans la nature de ta classe, d'avoir un ordre total basé sur la date qu'elle contient, alors il est normal qu'elle implémente Comparable et de s'en servir comme dans la FAQ.

    (Au passage, c'est : )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MaClasse implements Comparable<MaClasse> {
    //...
    	@Override
    	public int compareTo(MaClasse other) {
    		return this.getDate().compareTo(other.getDate());
    	}
    Mais il est aussi possible que dans d'autres circonstance, on puisse aussi bien ordonner ta classe en fonction de l'ordre alphabétique des noms qu'elle contient, ou par ordre de tel ou tel nombre, et qu'aucun de ces ordres possibles ne semble plus naturel, plus intrinsèque à la classe, que l'autre.

    Dans ce cas implémenter Comparable est absurde, et la solution la plus simple est d'utiliser un Comparator adapté au tri voulu.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Javascript] Détecter collision de deux objets <img>
    Par Invité4 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/04/2006, 08h54
  2. Réponses: 1
    Dernier message: 18/01/2006, 18h39
  3. [vector] Partager une même variable entre deux objets.
    Par Ekinoks dans le forum SL & STL
    Réponses: 18
    Dernier message: 25/08/2005, 20h40
  4. [ArrayList]transformer l'objet récupéré en double...
    Par snoop dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 16/07/2004, 16h16
  5. Afficher deux objets superposés C++ Builder 6
    Par nicoistia dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/03/2004, 15h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo