意外的排序列表

问题描述 投票:3回答:3

问候,

我有2个对象:

  • 请愿
  • 签字(signataires)

我写了这段代码:

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()返回一个List。

但结果不是我的预期:

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]

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

java list lambda comparator
3个回答
5
投票

当您链接两种时,结果是预期的。 第一个(.sorted(Comparator.comparingInt(petition -> petition.getSignataires().size()))按列表字段大小排序。然后第二个(.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开始,你可以创建Comparators并将它们结合起来,这要归功于.thenComparingXXX().reversed()方法。

所以你可以这样做:

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

3
投票

你不需要两个sorted操作。他们不会合并产生一个Comparator

第一个为Comparator<Integer>值构造int size(),而第二个忽略前一个调用并应用它自己的Comparator<Petition>Comparator.<Petition>reverseOrder())。

Comparator<Petition> reversedSignaturesSizeComparator 
        = Comparator.<Petition>comparingInt(p -> p.getSignataires().size()).reversed();
List<Petition> resultList = petitionList.stream()
                                        .sorted(reversedSignaturesSizeComparator)
                                        .collect(Collectors.toList());

1
投票

下面是另一种使用Collection的其他重载方法的方法,该方法使用自定义压缩器

Comparator<Petition> cmp = 
         (Petition left, Petition right) -> 
              left.getSignataires().size() - right.getSignataires().size();

List<Petition> resultList = petitionList.stream()
        .sorted(Collections.reverseOrder(cmp))
        .collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.