Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide Sort Arraylist

    9 octobre 2010 à 20:50:09


    Salut tout le monde,

    je vaux quelqu'un qui peut m'aider d'expliquer ce code:

    public class Joueur Implements Comparable {
    
    int reg;
    int departement;
    int point;
    String nom;
    .......
    
       Public Int compareTo(Joueur autreJoueur)
      
     {
          int resultat;
    
          if (this.point > autrejoueur.point)
             resultat = 1;
          if (this.point < autrejoueur.point)
             resultat = -1;
          if (this.point == autrejoueur.point)
             resultat = 0;
          return resultat;
       }
    }
    



    public class execl{
    
    ArrayList LesJoueurs = new ArrayList();
    ........
    LesJoueurs.add(new Joueur(10,168657,18,Ahmed));
    LesJoueurs.add(new Joueur(15,4557,12,Amal));
    LesJoueurs.add(new Joueur(11,1686,17,soufiane));
    
     Collections.sort(LesJoueurs);
    }
    



    Merci pour l'aide.

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      9 octobre 2010 à 21:15:13

      Qu'est-ce que tu ne comprends pas au juste ?

      EDIT :

      Après relecture du code, la méthode compareTo est beaucoup trop compliqué, tu peux simplement faire



      return this.point - autrejoueur.point;
      


      • Partager sur Facebook
      • Partager sur Twitter
        10 octobre 2010 à 1:20:09

        Alors, je vais te l'expliquer pas à pas comme si tu ne connaissais pas le java à 100% (même si je n'ai absolument pas la prétention de le connaître a 100% loin de là) mais je sais ce que fait ton code :).

        Premièrement, tu déclares une classe qui implémente l'interface Comparable. Cette interface te dit que ta classe doit comprendre une fonction :

        public int compareTo(T o)
        


        où "T" est le type de ta classe enfin bref. Cette fonction te permet d'établir un ordre naturel dans un ensemble. Par exemple dans ton cas, on souhaite classer des objets de type "joueur" par leur nombre de point. Cette méthode dis donc à java comment comparer deux joueurs en gros :). La méthode compareTo() doit toujours renvoyer un entier négatif, 0, ou un entier positif suivant que respectivement ton objet est plus petit, égale, ou supérieur à l'autre objet. Pour info, mais ça je pense que tu le savais, la méthode sera appelée comme ceci :

        joueur1.compareTo(joueur2)
        


        Ensuite dans le second code, tu déclares un ArrayList. Et la méthode static sort contenu dans Collections et qui prend en paramètre un objet de type List (donc qui comprend les ArrayList) utilise la fonction compareTo, afin de classer un tableau par ordre croissant en utilisant l'ordre naturel des objets de la liste, ici, des joueurs.

        Et n'oublie pas que la classe exec doit contenir une méthode main et non pas que le code soit écrit à l'ancienne entre les deux accolades :)

        Et j'oubliais, préfère écrire :



        public int compareTo(Joueur autreJoueur)
          
         {
        
              if(point < autreJoueur.getPoint())
              {
                    return -1;
              }
              else if (point > autreJoueur.getPoint())
              {
                    return 1;
              }
              return 0;
        }
        


        C'est plus propre et plus "sûr" dans le sens ou je retournerai toujours une valeur. Cela sous entend, qu'un un getter pour l'attribut point existe (eclipse peut les générer tout seul).

        Si tu as d'autres questions n'hésite pas.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          10 octobre 2010 à 3:41:16

          Citation : Nofrag



          public int compareTo(Joueur autreJoueur)
            
           {
          
                if(point < autreJoueur.getPoint())
                {
                      return -1;
                }
                else if (point > autreJoueur.getPoint())
                {
                      return 1;
                }
                return 0;
          }
          



          C'est plus propre et plus "sûr" dans le sens ou je retournerai toujours une valeur.



          Plus sur ? pas plus que ma proposition.

          Plus propre ? pas vraiment. ici c'est simple t'as juste une donnée membre à vérifier...combien de if il te faudrait pour comparer deux objets avec 5 données membres.

          Optimale alors ? non plus. Tu fais deux deux tests de comparaison qui sont inutiles. de plus tu fais appel à un getter qui complètement futile ici, car un objet de la classe à toujours accès à ses propres variable ( autreJoueur.getPoint() peux être remplacer par autreJoeur.point; ).

          Afin de trier une collection la méthode compareTo doit-être assez optimale afin d'avoir un réponse rapidement et dans cette optique, on évite les multiples verifications et appel de méthodes.

          C'est bien beau ici avec quelques éléments mais qu'arrive t'il si tu as un ArrayList de 1 million de joueurs
          dedans.....
          • Partager sur Facebook
          • Partager sur Twitter
            10 octobre 2010 à 9:59:15

            Merci tout le monde je peux savoir quel est la difference entre this.point et autreJoueur.getPoint(), j'ai mal compris
            • Partager sur Facebook
            • Partager sur Twitter
              10 octobre 2010 à 10:07:09

              Citation : rickthomas


              return this.point - autrejoueur.point;
              



              Le problème avec ça c'est que si un joueur a 10 points et l'autre 15, ça va retourner -5 (ou 5) alors qu'on veut -1, 0 ou 1.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                10 octobre 2010 à 13:36:01

                @Ishere11 : autreJoueur est la variable passé en paramètre tandis que this l'objet courant. Pour faire très court : this est l'objet qui a appelé la méthode.

                this.point --> va chercher la variable point de l'objet courant.
                autreJoueur.getPoint() --> appelle la méthode getPoint(méthode qui retourne la valeur de la variable point) de l'objet autre joueur.

                Citation : Shaddan

                Le problème avec ça c'est que si un joueur a 10 points et l'autre 15, ça va retourner -5 (ou 5) alors qu'on veut -1, 0 ou 1.



                C'est là que tu te trompes, la méthode compareTo doit retourner un entier négatif, zéro ou positif si l'élément courant est plus petit, égal ou plus grand à l'autre objet comparé.

                Voici un partie de la Javadoc à ce sujet

                Citation : JavaDoc(méthode compareTo)

                compareTo

                int compareTo(T o)

                Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.



                Par défaut, le monde retourne la valeur -1, 0 ou 1...mais ce n'est pas une obligation.
                • Partager sur Facebook
                • Partager sur Twitter

                Aide Sort Arraylist

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown