ストリームを使用しながら、ソートセットを作成します。

ハンズ:

私が持っているユーザーとクラス名、種類、年齢、その後、これらのユーザーの長いリストが私の入力されていますList<User> users = db.getUsers();

私はこのことから、すべてのユニークユーザーのセットを作成しようとしていますが、問題は、私はに基づいてそれらをソートするために探していますです年齢も。私は現在持っていますused-

Set<User> set = users.stream().collect(Collectors.toSet());

、だけでなく、同時に任意のアイデアを、このセットをソートする方法は?

ティムBiegeleisen:

これは、非ソートセット内順序の話をしても意味がありません。あなたのような何かを使用する必要がありTreeSetますが、年齢によって順序付けられたセットをしたい場合に。

Comparator<User> byAge = Comparator.comparingInt(User::getAge);

Supplier<TreeSet<User>> user = () -> new TreeSet<User>(byAge);

TreeSet<User> userSet = users.stream().collect(Collectors.toCollection(user));

上記のコードは、あなたに醜いことならば、あなたもちょうどに、ユーザーの現在のセットを追加することができTreeSetますが、1つの以上のコピーのステップが存在することになります。

使用しての主な違いTreeSetLinkedHashSetソート順を維持することに関係しています。TreeSet、新しいユーザーを追加する場合、ソートは維持されるだろう。LinkedHashSetあるため、新しいユーザーを追加すると、年齢によってソート順序を壊すかもしれないLinkedHashSet唯一の挿入順序を保持します。

編集:

以下@Federicoのコメントをもとに、TreeSet実際には、の平等を決定するためのコンパレータを使用するUserオブジェクトを。あなたが最初の手段によってすべての重複ユーザーを削除したい場合equals()の方法は、我々は最初にすべてのユーザーを追加することができHashSet、その後に追加するには、上記のアプローチを使用しますTreeSet

Set<User> set = new HashSet<>(users);   // remove duplicates via equals
TreeSet<User> userSet = set.stream().collect(Collectors.toCollection(user));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=177168&siteId=1