我刚刚遇到错误,并且在排序之前我还使用了这个 System.setProperty("java.util.Arrays.useLegacyMergeSort", "true") 但仍然遇到相同的错误。
以下是比较器比较值
Comparator<Balance> comp = (t1, t2) -> {
BigDecimal a1 = t1.getBalance();
BigDecimal a2 = t2.getBalance();
if (a1 == null && a2 == null) {
return 0;
} else if (a1 == null) {
return -1;
} else if (a2 == null) {
return 1;
}
return a1.compareTo(a2);
};
和 Balance 是具有一个平衡字段的类,我也有 Balance 列表,它的大小超过一千,以下是我的流。
List<Balance>result = balances.stream()
.sorted(comp)
.collect(Collectors.toList());
仍然得到同样的错误。
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:903) ~[?:?]
at java.util.TimSort.mergeAt(TimSort.java:520) ~[?:?]
at java.util.TimSort.mergeCollapse(TimSort.java:448) ~[?:?]
at java.util.TimSort.sort(TimSort.java:245) ~[?:?]
at java.util.Arrays.sort(Arrays.java:1515) ~[?:?]
at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:353) ~[?:?]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) ~[?:?]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[?:?]
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[?:?]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[?:?]
at com.giddh.api.services.v2.BalanceV2Service.applySortingToAccountBalanceReport(BalanceV2Service.java:106) ~[classes/:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
at jdk.internal.reflect.DelegatingMeth`enter code here`odAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:566)