首页 > 解决方案 > 无法使用 Comparator.Comparing 对 Java Set 进行排序

问题描述

我正在尝试使用 Comparator.comparing 对 Java 集进行排序。

我已经尝试过以下

Set<Survey> sortedSet = surveySet.stream().sorted(Comparator.comparing(Survey::getCreatedDate).reversed()).collect(Collectors.toSet())

它返回相同的排序,而不按 createdDate 排序(与最近的一样)。我究竟做错了什么?

更新:

只是提供一个更新,我实际上是如何通过变通解决我的问题的。

将集合转换为列表,然后在有效的列表上应用 Comparator.comparing。

List<Survey> sortedSurveyList = surveySet.stream().collect(Collectors.toList());

Collections.sort(sortedSurveyList,(Comparator.comparing(Survey::getCreatedDate).reversed()));
    return  sortedSurveyList;

然而,这不是我正在寻找的答案。我想知道为什么 Comparator.comparing 不适用于 Set。

标签: javaset

解决方案


根据文档Collectors#toSet

返回一个收集器,它将输入元素累积到一个新的 Set 中。不保证返回的 Set 的类型、可变性、可序列化性或线程安全性;如果需要对返回的 Set 进行更多控制,请使用 toCollection(Supplier)。

这是一个无序收集器。

因此,使用该收集器进行排序然后收集是没有意义的。您必须改为使用Collectors.toCollection(Supplier),提供一个保证排序的集合,例如LinkedHashSet.


推荐阅读