J'ai un utilisateur classe avec le nom, le type et l' âge , puis une longue liste de ces utilisateurs sont mes entrées List<User> users = db.getUsers();
.
Je suis en train de créer un ensemble de tous les utilisateurs uniques de cela, mais le problème est que je suis à la recherche pour les classer en fonction de l' âge aussi. J'ai actuellement utilisé-
Set<User> set = users.stream().collect(Collectors.toSet());
Comment trier cet ensemble en même temps que bien, une idée?
Il n'a pas de sens de parler de l' ordre dans un ensemble non trié. Vous devez utiliser quelque chose comme TreeSet
si vous voulez un ensemble ordonné par âge.
Comparator<User> byAge = Comparator.comparingInt(User::getAge);
Supplier<TreeSet<User>> user = () -> new TreeSet<User>(byAge);
TreeSet<User> userSet = users.stream().collect(Collectors.toCollection(user));
Si le code ci - dessus vous être laid, vous pouvez également ajouter simplement votre jeu actuel d'utilisateurs à un TreeSet
, mais il y aurait une étape de copie.
La principale différence entre l' utilisation d' un TreeSet
et LinkedHashSet
doit faire avec maintien de l' ordre de tri. Avec un TreeSet
, lors de l' ajout de nouveaux utilisateurs, le tri serait maintenue. Avec un LinkedHashSet
, l' ajout de nouveaux utilisateurs pourrait briser l'ordre de tri selon l' âge, parce LinkedHashSet
maintient que l' ordre d'insertion.
Éditer:
Sur la base des observations formulées par @Federico ci - dessous, une TreeSet
réelle utiliserait son comparateur pour déterminer l' égalité des User
objets. Si vous voulez d' abord supprimer tous les utilisateurs en double au moyen de la equals()
méthode, nous pouvons d' abord ajouter tous les utilisateurs à un HashSet
, puis utiliser l'approche ci - dessus pour les ajouter à un TreeSet
.
Set<User> set = new HashSet<>(users); // remove duplicates via equals
TreeSet<User> userSet = set.stream().collect(Collectors.toCollection(user));