15 votes

Comment trier une liste d'objets dans un tableau

J'ai une ArrayList, qui contient des équipes de football (classe Team). Les équipes ont des points et je veux les trier par nombre de points.

 public class Team {
     private int points;
     private String name;

     public Team(String n)
     {
         name = n;
     }

     public int getPoints
     {
         return points;
     }

     public void addPoints(boolean win)
 {
            if (win==true)
            {
    points = points + 3;
            }

            else if (win==false)
            {
            points = points + 1;
            }

}
 //...
 }

Classe principale :

 List<Team> lteams = new ArrayList<Team>;

 lteams.add(new Team("FC Barcelona"));
 lteams.add(new Team("Arsenal FC"));
 lteams.add(new Team("Chelsea"));

 //then adding 3 points to Chelsea and 1 point to Arsenal

 lteams.get(2).addPoints(true);
 lteams.get(1).addPoints(false);

 //And want sort teams by points (first index with most points). 

J'ai fait mon comparatif.

 public class MyComparator implements Comparator<Team> {

    @Override
    public int compare(Team o1, Team o2) {
        if (o1.getPoints() > o2.getPoints())
         {
             return 1;
         }
        else if (o1.getPoints() < o2.getPoints())
        {
            return -1;
        }
        return 0;    
    } 

}

maintenant je veux l'utiliser (dans la classe principale)

 Colections.sort(lteams, new MyComparator());

Je veux voir :

  1. Chelsea
  2. Arsenal
  3. Barcelone

Mais ça ne trie pas.

30voto

PaRiMaL RaJ Points 9206

Source : Ici

Vous pouvez utiliser Collections.sort avec un Comparator<Team> .

    class Team {
        public final int points;
        // ...
    };

    List<Team> players = // ...

    Collections.sort(players, new Comparator<Team>() {
        @Override public int compare(Team p1, Team p2) {
            return p1.points- p2.points;
        }

    });

Sinon, vous pouvez faire Team implementsComparable<Team> . Ceci définit le site ordre naturel pour tous les Team objets. En utilisant un Comparator est plus flexible dans la mesure où différentes implémentations peuvent ordonner par nom, âge, etc.

Voir aussi


Par souci d'exhaustivité, je tiens à préciser que les return o1.f - o2.f Le raccourci de comparaison par soustraction doit être utilisé avec une extrême prudence en raison de possibles débordements (lire : Effective Java 2ème édition : Point 12 : Envisager de mettre en œuvre Comparable ). On peut supposer que le hockey n'est pas un sport où un joueur peut marquer des buts dans une quantité qui causerait des problèmes =).

Voir aussi

13voto

Dmitry Stril Points 698
public class Team {
   private int points;
   private String name;

public Team(String n, int p) {
    name = n;
    points = p;
}

public int getPoints() {
    return points;
}

public String getName() {
    return name;
}

public static void main(String[] args) {
    List<Team> lteams = new ArrayList<Team>();

    lteams.add(new Team("FC Barcelona", 0));
    lteams.add(new Team("Arsenal FC", 2));
    lteams.add(new Team("Chelsea", 3));

    Collections.sort(lteams, new MyComparator());

    for (Team lteam : lteams) {
        System.out.println(lteam.name + ": " + lteam.points + " points");
    }
}

}

class MyComparator implements Comparator<Team> {
@Override
public int compare(Team o1, Team o2) {
    if (o1.getPoints() > o2.getPoints()) {
        return -1;
    } else if (o1.getPoints() < o2.getPoints()) {
        return 1;
    }
    return 0;
}}

Sortie :
Chelsea : 3 points
Arsenal FC : 2 points
FC Barcelone : 0 point

0voto

Lefteris Xris Points 88

Il n'est pas vraiment nécessaire de définir un comparateur personnalisé comme celui-ci.

Au lieu de cela, vous pouvez facilement en définir un, lorsque vous voulez trier votre ArrayList.

Depuis JAVA 8, l'utilisation de lamda

    // Sort version.
    Iteams.sort(Comparator.comparing(Team::getPoints));

    // Complete version.
    Iteams.sort((o1, o2) -> o1.getPoints().compareTo(o2.getPoints()));

Il existe également des options pour deuxième comparateur si les objets sont égaux sur le premier :

    // e.g. if same points, then compare their names.
    Iteams.sort(Comparator.comparing(Team::getPoints).thenComparing(Team::getName));

Notez également que l'option de tri par défaut est ascendant mais vous pouvez le régler sur descendant en utilisant :

    // e.g. Sort by points descending.
    Iteams.sort(Comparator.comparing(Team::getPoints).reversed());

Ainsi, vous pouvez trier votre ArrayList de différentes manières quand vous le souhaitez, en ajoutant simplement la méthode que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X