java - 使用流时创建排序集
问题描述
我有一个包含名称、类型和年龄的User类,然后这些用户的长列表是我的输入。List<User> users = db.getUsers();
我正在尝试从中创建一组所有唯一用户,但问题是我也在寻找根据年龄对它们进行排序。我目前使用过——
Set<User> set = users.stream().collect(Collectors.toSet());
如何同时对这个集合进行排序,知道吗?
解决方案
在未排序的集合中谈论顺序是没有意义的。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));
推荐阅读
- asp.net-mvc - 对空 mvc 项目进行身份验证
- android - 如何在单击 ListView 时更改 TextView 背景颜色?
- python - Pandas 数据框随机随机排列组中的一些列值
- docker - 在 Google Cloud Publish 上找不到 gcr.io/google-appengine/aspnetcore:3.1 的清单
- enums - openApi架构中不区分大小写的字符串参数
- python - 向图像中的区域添加噪点
- javascript - 如何防止自定义框模态在单击外部或按退出时消失
- ruby-on-rails - 如果标记为销毁的嵌套属性不存在,则不要引发 ActiveRecord::RecordNotFound
- java - 在服务器端验证文件
- python - 熊猫数据框适用于日期时间列:不起作用