Jodatime - 比较方法违反了它的一般契约

问题描述 投票:0回答:0

假设以下java方法:

private Collection<TimeDTO> sortTimes(Choice choice) {

    final List<TimeDTO> times = new ArrayList<>(timeCache.getAll(choice));

    Collections.sort(times, new Comparator<TimeDTO>() {
        @Override
        public int compare(final TimeDTO o1, final TimeDTO o2) {
            if (o1.getTime() == null) {
                return -1;
            }
            if (o2.getTime() == null) {
                return 1;
            }
            return o1.getTime().compareTo(o2.getTime());
        }
    });

    return times;
}

列表可以包含大量项目(50000+)。 将其视为多线程环境。 getTime() 返回“org.joda.time.DateTime”。 timeCache 可以在其他线程上改变。

但有时还是有:

Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeHi(TimSort.java:899) ~[na:1.8.0_301]
    at java.util.TimSort.mergeAt(TimSort.java:516) ~[na:1.8.0_301]
    at java.util.TimSort.mergeCollapse(TimSort.java:439) ~[na:1.8.0_301]
    at java.util.TimSort.sort(TimSort.java:245) ~[na:1.8.0_301]
    at java.util.Arrays.sort(Arrays.java:1512) ~[na:1.8.0_301]
    at java.util.ArrayList.sort(ArrayList.java:1464) ~[na:1.8.0_301]
    at java.util.Collections.sort(Collections.java:177) ~[na:1.8.0_301]
    at ****.ServiceImpl.sortTimes(ServiceImpl.java:100)

可能是什么问题?任何想法? 谢谢。

java sorting collections jodatime comparator
© www.soinside.com 2019 - 2024. All rights reserved.