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 globalement non triée


Sujet :

Collection et Stream Java

  1. #1
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut ArrayList globalement non triée
    Bonjour,

    J’ai créé une classe assez bête qui implémente l’interface Comparable.
    J’ai donc créé une méthode compareTo( ) qui semble réaliser son travail entre 2 objets de ma classe, mais pas au sien d’un ArrayList.

    En fait, lorsque j’exécute mon petit bout de classe en pas-à-pas, je me rend compte que chaque élément de la collection est comparé avec le suivant, mais pas avec ceux qui suivent.

    Voici ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    package DEFAULT;
     
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
     
    public class Dependance implements Comparable {
     
        String nomFichier;
        ArrayList<String> dependances = new ArrayList<String>();
     
        @Override
        public String toString() {
            String description;
            description = nomFichier + " dépend de";
            for (String dep : dependances) {
                description += " " + dep;
            }
            return description;
        }
     
        public int compareTo(Object o) {
            String nom2 = ((Dependance) o).nomFichier;
            ArrayList<String> dep2 = ((Dependance) o).dependances;
     
            // Si l'objet transmis fait partie des dépendances de l'objet courant
            // il doit être mis en tête
            if (this.dependances.contains(nom2)) {
                return 1;
            }
            // Si l'objet courant fait partie des dépendances de l'objet transmis
            // il doit être mis en tête
            if (dep2.contains(this.nomFichier)) {
                return -1;
            }
            return 0;
        }
     
        public static void main(String[] args) {
            List<Dependance> tabDep = new ArrayList<Dependance>();
            Dependance dep1 = new Dependance();
            Dependance dep2 = new Dependance();
            Dependance dep3 = new Dependance();
     
            dep1.nomFichier = "fic1";
            dep1.dependances.add("fic25");
            dep1.dependances.add("fic30");
            dep1.dependances.add("fic50");
            tabDep.add(dep1);
     
            dep2.nomFichier = "fic2";
            dep2.dependances.add("fic15");
            dep2.dependances.add("fic30");
            dep2.dependances.add("fic50");
            tabDep.add(dep2);
     
     
            dep3.nomFichier = "fic25";
            dep3.dependances.add("fic15");
            dep3.dependances.add("fic30");
            dep3.dependances.add("fic50");
            tabDep.add(dep3);
     
            System.out.println("Liste des éléments avant le tri");
            for (Dependance dep : tabDep) {
                System.out.println(dep.toString());
            }
     
            Collections.sort(tabDep);
     
            System.out.println("Liste des éléments APRES le tri");
            for (Dependance dep : tabDep) {
                System.out.println(dep.toString());
            }
        }
    }
    Lors d’une exécution en pas-à-pas, j’ai une comparaison entre dep1 et dep2, puis entre dep2 et dep3, mais je n’en ai jamais entre dep1 et dep3 ???

    D’ailleurs, si on inverse l’ordre d’alimentation de la collection : dep2 puis dep1 puis dep3, on peut constater le tri attendu car « Collections.sort(tabDep); » nous retourne bien dep2 puis dep3 puis dep1.

    Aurais-je manqué quelque chose dans ce tri afin qu'il compare l'ensemble des éléments entre eux ?

    Chris

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Le probleme vient de ta fonction de comparaison je crois. En effet, on a
    dep1==dep2
    dep2==dep3
    Par transitivité, on aurait donc dep1==dep3
    Or la fonction donne dep1>dep3
    Pas facile de faire un tri dans ces conditions

  3. #3
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Je te remercie Sanguko,

    Je n’y avais pas fait attention, et je pense effectivement que tu tiens la clef technique de mon problème.
    Il ne me reste plus qu’à identifier des critères de tri suffisants pour être exhaustif.

    Merci,
    Chris.

    PS : Merci bouye pour avoir déplacé le sujet .

  4. #4
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Bien, j’ai essayé avec une classe plus simple, le secret est bien là : la transitivité.

    Je n’ai plus qu’à trouver des critères qui aient un sens dans mon cas réel.

    Merci bien,
    Chris

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

Discussions similaires

  1. ArrayList static non static
    Par Team2009 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 23/05/2010, 22h23
  2. Variable globale non accessible
    Par bolduc4 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 10/05/2010, 01h23
  3. [WD14] Table non triée alors que RQ triée + typage des rubriques
    Par cladoo dans le forum WinDev
    Réponses: 3
    Dernier message: 24/09/2009, 09h10
  4. Ordre des colonnes non triée alphabetiquement
    Par mouss4rs dans le forum JPA
    Réponses: 4
    Dernier message: 30/05/2008, 16h51
  5. Récuperer les n valeurs plus grandes d'une liste non triée
    Par Oberown dans le forum Algorithmes et structures de données
    Réponses: 17
    Dernier message: 26/07/2007, 12h34

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