首页 > 解决方案 > 使用流时创建排序集

问题描述

我有一个包含名称、类型和年龄的User类,然后这些用户的长列表是我的输入。List<User> users = db.getUsers();

我正在尝试从中创建一组所有唯一用户,但问题是我也在寻找根据年龄对它们进行排序。我目前使用过——

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

如何同时对这个集合进行排序,知道吗?

标签: javajava-8java-stream

解决方案


在未排序的集合中谈论顺序是没有意义的。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));

如果上面的代码对您来说很难看,您也可以将您当前的一组用户添加到 aTreeSet中,但是还有一个复制步骤。

TreeSet使用 a和 a的主要区别在于LinkedHashSet维护排序顺序。使用TreeSet, 添加新用户时,排序将保持不变。使用 a LinkedHashSet,添加新用户可能会破坏按年龄排序的顺序,因为LinkedHashSet只维护插入顺序。

编辑:

根据下面@Federico 的评论,TreeSet实际将使用其比较器来确定User对象的相等性。如果你想先通过该equals()方法删除所有重复用户,那么我们可以先将所有用户添加到 aHashSet中,然后使用上述方法将它们添加到 aTreeSet中。

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

推荐阅读