java.util.stream.Stream#sorted(java.util.Comparator<? super T>)
时间: 2023-12-09 13:02:49 浏览: 218
java.util.stream.Stream#sorted(java.util.Comparator<? super T>)是Java 8中Stream API提供的一个方法,用于对Stream中的元素进行自定义排序。该方法接收一个Comparator对象作为参数,用于比较Stream中的元素的大小关系。在排序完成后,该方法返回一个新的Stream对象,该对象包含排序后的元素。需要注意的是,该方法不会改变原有的Stream对象,而是生成一个新的Stream对象。
例如,假设有一个List<String>对象list,我们可以通过以下代码对其进行排序:
```
List<String> sortedList = list.stream()
.sorted((s1, s2) -> s1.compareTo(s2))
.collect(Collectors.toList());
```
在上面的代码中,我们首先将list转化为Stream对象,然后使用sorted方法对其进行排序,该方法接收一个Comparator对象,使用Lambda表达式实现字符串的比较。最后通过collect方法将排序后的结果保存到一个新的List中。
相关问题
java.util.stream.Stream#sorted(java.util.Comparator<? super T>) 如何定义正序和倒序
java.util.stream.Stream#sorted(java.util.Comparator<? super T>)方法可以接收一个Comparator对象作为参数,用于比较Stream中的元素的大小关系。我们可以通过实现Comparator接口来定义自己的比较器,从而实现正序或倒序排列。
如果我们希望按照元素的自然顺序进行排序,可以使用元素本身的compareTo()方法。例如,对于一个List<Integer>对象list,我们可以使用以下代码对其进行排序:
```
List<Integer> sortedList = list.stream()
.sorted()
.collect(Collectors.toList());
```
在上述代码中,我们没有传递Comparator对象,因此会使用元素自身的compareTo()方法进行比较,从而按照元素的自然顺序进行排序。
如果我们希望按照元素的降序排列,可以在Comparator对象的compare()方法中返回负数。例如,对于一个List<Integer>对象list,我们可以使用以下代码对其进行降序排列:
```
List<Integer> sortedList = list.stream()
.sorted((i1, i2) -> i2.compareTo(i1))
.collect(Collectors.toList());
```
在上述代码中,我们传递了一个Comparator对象,该对象使用i2.compareTo(i1)比较元素的大小关系,从而实现了降序排列。
Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeLo(TimSort.java:777) at java.util.TimSort.mergeAt(TimSort.java:514) at java.util.TimSort.mergeCollapse(TimSort.java:441) at java.util.TimSort.sort(TimSort.java:245) at java.util.Arrays.sort(Arrays.java:1512) at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:348) at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:500) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:486) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at
这个错误通常是由于排序算法的比较方法实现不正确引起的。在 Java 中,如果实现了 Comparator 接口的 compare() 方法,必须满足如下三个条件:
1. 自反性:对于所有 x,compare(x, x) == 0。
2. 对称性:对于所有 x 和 y,如果 compare(x, y) > 0,则 compare(y, x) < 0。
3. 传递性:对于所有 x、y 和 z,如果 compare(x, y) > 0 且 compare(y, z) > 0,则 compare(x, z) > 0。
如果这些条件没有被满足,就可能会导致类似于“Comparison method violates its general contract”这样的错误。
要解决这个问题,可以检查比较方法的实现,确保它满足上述三个条件。另外,如果使用了 Java 8 的流式操作和排序方法,也可以尝试使用 sorted() 方法的重载版本:sorted(Comparator.comparing(...).thenComparing(...)),它会同时应用多个比较条件,避免出现违反比较契约的情况。
阅读全文