如何不要做:
- 不要使用
.sorted(Comparator.reverseOrder())
或.sorted(Collections.reverseOrder())
,因为它只会按降序排序元素。
对于给定的整数输入,使用它:
[1, 4, 2, 5, 3]
输出将如下所示:
[5, 4, 3, 2, 1]
对于字符串输入:
["A", "D", "B", "E", "C"]
输出将如下所示:
[E, D, C, B, A]
- 不要使用
.sorted((a, b) -> -1)
(解释在结尾处)
正确的最简单方法:
List<Integer> list = Arrays.asList(1, 4, 2, 5, 3);
Collections.reverse(list);
System.out.println(list);
输出:
[3, 5, 2, 4, 1]
对于String
也是同样的操作:
List<String> stringList = Arrays.asList("A", "D", "B", "E", "C");
Collections.reverse(stringList);
System.out.println(stringList);
输出:
[C, E, B, D, A]
不要使用 .sorted((a, b) -> -1)
!
这会破坏比较器的合同,并且可能仅适用于某些情况,例如仅在单线程中而不是并行中。
简单解释:
(a, b) -> -1
违反了 Comparator
的合同。这是否有效取决于排序算法的实现。JVM 的下一个版本可能会破坏此功能。实际上,我可以使用 IntStream.range(0, 10000).parallel().boxed().sorted((a, b) -> -1).forEachOrdered(System.out::println);
在我的计算机上可重现地破坏它。
//Don't use this!!!
List<Integer> list = Arrays.asList(1, 4, 2, 5, 3)
List<Integer> reversedList = list.stream()
.sorted((a, b) -> -1)
.collect(Collectors.toList())
System.out.println(reversedList)
正常情况下的输出结果为:
[3, 5, 2, 4, 1]
在并行流或其他JVM实现中可能会出现以下输出结果:
[4, 1, 2, 3, 5]
String
类型同理:
List<String> stringList = Arrays.asList("A", "D", "B", "E", "C");
List<String> reversedStringList = stringList.stream()
.sorted((a, b) -> -1)
.collect(Collectors.toList());
System.out.println(reversedStringList);
正常情况下的输出结果为:
[C, E, B, D, A]
在并行流或其他JVM实现中,可能的输出结果为:
[A, E, B, D, C]
IntStream
没有.sorted(Comparator)
方法;你必须先通过一个Stream<Integer>
并在那里反转后再产生一个IntStream
。 - fgeIntStream.range(0, n)
,可以使用类似于map(i -> n - i - 1)
的方式。无需进行装箱和排序。 - Stuart Marks1, 3, 2
,您期望的结果是什么?您想要倒转后的“流”,例如2, 3, 1
,还是排序后的“流”,例如3, 2, 1
? - chiccodoro