java - 意外的排序列表

标签 java list lambda comparator

问候,

我有 2 个对象:

  • 请愿书
  • Signataire(签字人)

我写了这段代码:

public List<Petition> getTheMostSigned(long groupId){

    List<Petition> petitionList = petitionPersistence.findByStatusAndGroupId(0,groupId);

    _log.info("list avant getTheMostSigned size  : "+petitionList.stream().map(petition -> petition.getSignataires().size()).collect(Collectors.toList()));

    List<Petition> resultList = petitionList.stream()
            .sorted(Comparator.comparingInt(petition -> petition.getSignataires().size()))
            .sorted(Collections.reverseOrder())
            .collect(Collectors.toList());

    _log.info("list apres getTheMostSigned size  : "+resultList.stream().map(petition -> petition.getSignataires().size()).collect(Collectors.toList()));

    return resultList;

getSignataires() 返回一个列表。

但结果不是我所期望的:

enter image description here

2018-09-12 12:44:25.686 INFO  [http-nio-8080-exec-10][PetitionLocalServiceImpl:390] list avant getTheMostSigned size  : [0, 0, 400, 0, 3, 401, 5501]
2018-09-12 12:44:25.856 INFO  [http-nio-8080-exec-10][PetitionLocalServiceImpl:396] list apres getTheMostSigned size  : [5501, 401, 3, 0, 0, **400**, 0]

如您所见,倒数第二个不是好的。 你知道为什么比较器没有完成这项工作吗?

最佳答案

当您链接两个排序时,结果是预期的。
第一个(.sorted(Comparator.comparingInt(petition -> petition.getSignataires().size()))按列表字段大小排序)。 Then 第二个 (.sorted(Collections.reverseOrder())) 覆盖第一个排序结果,因为最后一个排序根据 Petition 的反向自然顺序排序
当您两次调用排序流操作时,大体上就像您使用了这个逻辑:

List<Petition> petitionList = ...;
// first sort
petitionList.sort(Comparator.comparingInt(petition -> petition.getSignataires().size());
// second sort
petitionList.sort(Collections.reversed());

您需要定义一个结合了这些约束的 Comparator 实例。
从 Java 8 开始,您可以创建 Comparator 并将它们组合起来,这主要归功于 .thenComparingXXX().reversed() 方法。

所以你可以这样做:

.sorted(Comparator.comparingInt(petition -> petition.getSignataires().size())
                  .reversed()
       )

关于java - 意外的排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52296226/

相关文章:

c# - IEnumerable.Any(Func) 什么时候返回值?

c# - 如何在 lambda 表达式中实现 AND 逻辑?

java - 将 REST Web 请求从 Python 转换为 Java

java - 我怎样才能在我的java上使用c函数

java - 如何使返回类型具有与打印函数相同的输出?

java - 添加带有过期时间的 cookie 时,Cookie 过期时间必须为正整数 最大 java 日期 Aug 17, 292278994 12 :42:55 PM

python - 从数组列表中删除数组 Python

java - 我应该如何使用 Jackson 将 JSON(其键之一包含数组结构)解析为对象?

python - 如何从包含来自多个来源的多个词典的列表中创建数据框

java - 如何在 lambda 表达式中从另一个对象设置一个对象