0

我刚刚遇到错误,并且在排序之前我还使用了这个 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)
4

1 回答 1

0

发布的问题似乎不可重现。

发布的比较器等效于以下比较器:

Comparator<Balance> comp = Comparator.comparing(
    Balance::getBalance, Comparator.nullsFirst(Comparator.naturalOrder())
);

它非常稳定。

因此,实际比较代码与呈现的代码片段不同,或者余额数组/集合中的元素可能会在应用排序时从另一个线程更新。

于 2022-01-30T11:34:01.733 回答