【问题标题】:Cannot sort Java Set using Comparator.Comparing [duplicate]无法使用 Comparator.Comparing 对 Java Set 进行排序 [重复]
【发布时间】:2019-11-14 02:05:29
【问题描述】:

我正在尝试使用 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。

【问题讨论】:

    标签: java set


    【解决方案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())));
    

    【讨论】:

      【解决方案2】:

      根据Collectors#toSet 上的文档

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

      这是一个无序收集器。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2011-07-07
        • 2016-11-07
        相关资源
        最近更新 更多