如何简化比较



我确实有这样的列表:

List<Integer> list = new ArrayList<>();
list.add(24);
list.add(12);
list.add(0);
list.add(36);
list.add(1);
list.add(99);

我想按升序排序,但0必须始终在最后一个。有什么方法可以简化它吗?

List<Integer> collect = list.stream()
.sorted((a,b) -> b.compareTo(a))
.sorted((a, b) -> Integer.valueOf(0).equals(a) ? 1 : -1)
.collect(Collectors.toList());
List<Integer> list = List.of(24, 12, 0, 36, 1, 99);
List<Integer> sorted = list.stream()
.sorted(Comparator.comparingInt(a -> a == 0 ? Integer.MAX_VALUE : a))
.toList();
System.out.println(sorted);

似乎有效;打印CCD_ 1。

一个缺点是,如果列表中确实有最大整数值(即2147483647(,它就不会做正确的事情,在这种情况下,它会在它们之间而不是在它们之后对0进行排序。如果这是一个问题,没有什么比你做的要短得多。

注意:您的代码显示为按降序排序。在这种情况下,0将已经在末尾排序,除非您有负数。如果这就是你想要的,而"升序"是一个拼写错误,你就必须使用MIN_VALUE,并反转比较器(最后加上.reverse()(。

您可以在同一sorted:中进行处理

List<Integer> collect = list.stream()
.sorted((o1, o2) -> o1 == 0 ? 1 : (o2 == 0 ? -1 : o1.compareTo(o2)))
.collect(Collectors.toList());

可能会为比较器引入变量,如果int等于零,则比较布尔值可能会简化或至少使其可读

Comparator<Integer> natural  = Comparator.naturalOrder();
Comparator<Integer> zeroLast = Comparator.comparing(i -> i.equals(0));
List<Integer> collect = list.stream()
.sorted(natural)
.sorted(zeroLast)
.collect(Collectors.toList());

相关内容

  • 没有找到相关文章

最新更新