无法使用Comparator对Java Set进行排序

时间:2019-07-03 11:31:26

标签: java set

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

我已经尝试了以下方法

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

它返回相同的排序,但不按createdDate排序(最新的)。我在做什么错了?

更新

只需提供最新的信息,说明我如何实际解决问题。

将集合转换为List,然后将Comparator.comparing应用于有效的List。

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

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

尽管如此,这不是我想要的答案。我想知道为什么Comparator.comparing不适用于Set。

2 个答案:

答案 0 :(得分:4)

根据Collectors#toSet上的文档

  

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

     

这是一个无序的收集器。

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

答案 1 :(得分:1)

您正在使用Set,它没有顺序。尝试使用具有顺序的集合,例如SortedSet(实现:TreeSet)或List

final Set<Survey> surveySet = null;
final List<Survey> sortedList = surveySet.stream()
            .sorted(Comparator.comparing(Survey::getCreatedDate).reversed())
            .collect(Collectors.toList());

final SortedSet<Survey> sortedSet = surveySet.stream()
            .collect(Collectors.toCollection(
                    () -> new TreeSet<>(Comparator.comparing(Survey::getCreatedDate).reversed())));