J’ai ArrayList, qui contient les équipes de football (classe class). Les équipes ont des points et je veux les sortinger par nombre de points.
public class Team { private int points; private Ssortingng name; public Team(Ssortingng 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 lteams = new ArrayList; 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 { @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:
Mais ça ne sortinge pas.
Source: ici
Vous pouvez utiliser Collections.sort
avec un Comparator
.
class Team { public final int points; // ... }; List players = // ... Collections.sort(players, new Comparator () { @Override public int compare(Team p1, Team p2) { return p1.points- p2.points; } });
Vous pouvez également faire en sorte que l’ Team implements
Comparable
. Ceci définit l’ ordre naturel pour tous les objects de l’ Team
. L’utilisation d’un Comparator
est plus flexible en ce que différentes implémentations peuvent classer par nom, âge, etc.
Comparable
et de Comparator
? Pour être complet, je return o1.f - o2.f
que le return o1.f - o2.f
comparaison par soustraction doit être utilisé avec une extrême prudence en raison de possibles débordements (lire: Effective Java 2nd Edition: Point 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 =)
public class Team { private int points; private Ssortingng name; public Team(Ssortingng n, int p) { name = n; points = p; } public int getPoints() { return points; } public Ssortingng getName() { return name; } public static void main(Ssortingng[] args) { List lteams = new ArrayList (); 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 { @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
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 souhaitez sortinger votre ArrayList.
// 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 le second comparateur , si les objects sont égaux sur le premier:
// eg if same points, then compare their names. Iteams.sort(Comparator.comparing(Team::getPoints).thenComparing(Team::getName));
Notez également que l’option de sorting par défaut est croissante , mais que vous pouvez la définir en mode décroissant à l’ aide de:
// eg Sort by points descending. Iteams.sort(Comparator.comparing(Team::getPoints).reversed());
De cette façon, vous pouvez sortinger votre ArrayList de différentes manières à tout moment, en ajoutant simplement la méthode souhaitée.
Utilisez ce lien et vous trouverez la réponse à cette question.