web-dev-qa-db-fra.com

Comment trier Arraylist d'objets

J'ai ArrayList, qui contient les équipes de football (classe). 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 comparateur.

 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 (en classe principale)

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

Je veux voir:

  1. Chelsea
  2. Arsenal
  3. Barcelone

Mais ça ne trie pas.

14
n0hepe

Source: ici

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

    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;
        }

    });

Alternativement, vous pouvez faire Team implementsComparable<Team> . Ceci définit l'ordre naturel pour tous les objets Team. L'utilisation de Comparator est plus flexible en ce sens que différentes implémentations peuvent être classées par nom, par âge, etc.

Voir également


Pour être complet, je tiens à signaler que le raccourci return o1.f - o2.f comparaison par soustraction doit être utilisé avec une extrême prudence en raison de possibles débordements (voir: Effective Java 2nd Edition: Élément 12: envisagez de mettre en œuvre Comparable). Vraisemblablement, le hockey n’est pas un sport dans lequel un joueur peut marquer des buts d’un montant qui causerait des problèmes =)

Voir également

30
PaRiMaL RaJ
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 points

13
Dmitry Stril

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

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

Depuis Java 8 en utilisant 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 second 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 estascendant, mais vous pouvez la régler surdécroissanten utilisant:

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


De cette façon, vous pouvez trier votre ArrayList de différentes manières à tout moment, en ajoutant simplement la méthode de votre choix.

0
Lefteris Xris