web-dev-qa-db-fra.com

Comment trier une liste d'objets par propriété?

Disons que vous avez une Arraylist de HockeyPlayer objets. 

Comment pouvez-vous trier cela s'ils ont tous une variable int butsScored . Comment pouvez-vous les trier par buts marqués?

33
sieve411

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

    class HockeyPlayer {
        public final int goalsScored;
        // ...
    };

    List<HockeyPlayer> players = // ...

    Collections.sort(players, new Comparator<HockeyPlayer>() {
        @Override public int compare(HockeyPlayer p1, HockeyPlayer p2) {
            return p1.goalsScored - p2.goalsScored; // Ascending
        }

    });

La partie comparaison peut également être écrite de cette façon:

players.sort(Comparator.comparingInt(HockeyPLayer::goalsScored));

Vous pouvez également créer HockeyPlayer implementsComparable<HockeyPlayer> . Ceci définit l'ordre naturel pour tous les objets HockeyPlayer. 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 de 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

85
polygenelubricants

Comme @ user6158055 le suggère, il s'agit d'un liner avec Java 8, comme suit:

Collections.sort(
                hockeyPlayerList,
                (player1, player2) -> player1.getGoalsScored()
                        - player2.getGoalsScored());

Exemple complet pour décrire le même:

import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.List;

public class Main {

    public static void main(String[] args) {
        List<HockeyPlayer> hockeyPlayerList = new ArrayList<>();
        hockeyPlayerList.add(new HockeyPlayer("A", 3));
        hockeyPlayerList.add(new HockeyPlayer("D", 10));
        hockeyPlayerList.add(new HockeyPlayer("B", 2));

        System.out.println("Before Sort based on goalsScored\n");

        hockeyPlayerList.forEach(System.out::println);

        System.out.println("\nAfter Sort based on goalsScored\n");

        Collections.sort(
                hockeyPlayerList,
                (player1, player2) -> player1.getGoalsScored()
                        - player2.getGoalsScored());

        hockeyPlayerList.forEach(System.out::println);
    }

    static class HockeyPlayer {

        private String name;
        private int goalsScored;

        public HockeyPlayer(final String name, final int goalsScored) {
            this.name = name;
            this.goalsScored = goalsScored;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getGoalsScored() {
            return goalsScored;
        }

        public void setGoalsScored(int goalsScored) {
            this.goalsScored = goalsScored;
        }

        @Override
        public String toString() {
            return "HockeyPlayer [name=" + name + ", goalsScored="
                    + goalsScored + "]";
        }

    }
}

Sortie :

Before Sort based on goalsScored

HockeyPlayer [name=A, goalsScored=3]
HockeyPlayer [name=D, goalsScored=10]
HockeyPlayer [name=B, goalsScored=2]

After Sort based on goalsScored

HockeyPlayer [name=B, goalsScored=2]
HockeyPlayer [name=A, goalsScored=3]
HockeyPlayer [name=D, goalsScored=10]
5
Arpit

Ecrivez un comparateur personnalisé pour faire le travail.

3
duffymo

Juste une ligne avec Java 8: 

Collections.sort(players, (p1, p2) -> p1.getGoalsScored() - p2.getGoalsScored());
2
user6158055

Utilisez un comparateur générique tel que le comparateur Bean .

2
camickr

Java a un ensemble de méthodes sort () pour ce genre de chose. Voir Collections.sort (et comparable) pour plus de détails.

0
CWF

Avec Java 8, c'est simple

Collections.sort(playList, Comparator.comparingInt(HockeyPLayer::goalsScored))
0
Satyajit