gpt4 book ai didi

java - Collections.sort 抛出 IllegalArgumentException

转载 作者:太空宇宙 更新时间:2023-11-04 07:14:12 25 4
gpt4 key购买 nike

我正在尝试对包含字符串和 double 值的对象列表进行排序:

lock.tryLock();
if (testTagRev.size() > 0)
Collections.sort(testTagRev, documentSampleComperator);
lock.unlock();

documentSampleComperator 是一个 documentSampleComparer 类型:

class documentSampleComparer implements Comparator<DocumentSample> {
@Override
public int compare(DocumentSample x, DocumentSample y) {
int ans = x.getText().toString().compareTo(y.getText().toString());
// ans = utils.listToString(x.getText(), ' ').compareTo(utils.listToString(y.getText(),' ')); also didn't work
if (ans == 0)
return Integer.compare(x.hashCode(), y.hashCode());
else return ans;
}
}

即使压实器是可传递的,我仍然得到这个异常:

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method     violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:747)
at java.util.TimSort.mergeAt(TimSort.java:483)
at java.util.TimSort.mergeCollapse(TimSort.java:410)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
at Trainer.MCobjectStream.<init>(MCobjectStream.java:64)
at Trainer.filterRev.<init>(filterRev.java:64)
at Trainer.Train.main(Train.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

我使用的是jdk 1.7.0_45,你能看出问题出在哪里吗?

编辑:utils.listToString 将字符串列表转换为字符串,添加锁定代码并注释我之前尝试使其工作的行。我还应该提到,异常仅有时发生,但我没有使用线程。

最佳答案

实现Comparator不应涉及对象的hashCode。通常您只需按重要性顺序比较每个属性即可。在您的示例中,如果文本是您想要比较的唯一内容,那么它应该是:

Collections.sort(catalog, new Comparator<DocumentSample>() {
@Override
public int compare(DocumentSample x, DocumentSample y) {
return x.getText().toString().compareTo(y.getText().toString());
}
});

通过比较 hashCode 的默认实现(返回对象内部地址的整数表示),您可以说,当且仅当两个对象是内存中的同一对象时,它们才会被视为相等。

关于java - Collections.sort 抛出 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20219526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com