- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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)
我正在根据以下比较器对集合进行排序。
public static Comparator<MyClass> CMP_TIME_DESC = new Comparator<MyClass>() {
@Override
public int compare(MyClass o1, MyClass o2) {
return o2.getOrderSendTime().compareTo(o1.getOrderSendTime());
}
};
值总是非空的。getOrderSendTime() 对象属于 java.util.Date 类。
我知道这是一种传递性不一致,我认为像这样的类不会有这样的问题。我搜索了 Unresolved 问题,但没有找到与该主题相关的任何问题。
有什么想法吗?
最佳答案
我有同样的异常,当我在排序时在同一个列表/数组中有 java.util.Date
和 java.sql.Timestamp
对象时发生, 在 Java8 上运行。 (这种混合是由于一些对象是从具有 Timestamp
数据类型的数据库记录中加载的,而其他对象是手动创建的,并且这些对象中只有一个 Date
对象。 )
每次对同一数据集进行排序时也不会发生异常,并且似乎数组中至少还必须有 32 个这样的混合对象才能发生。
如果我使用传统的排序算法,这也不会发生(请参阅 Ortomala Lokni 的回答)。
如果您仅使用数组中的 java.util.Date
对象或仅使用 java.sql.Timestamp
对象,这也不会发生。
因此,问题似乎是 TimSort
与 java.util.Date
和 java.sql.Timestamp
中的 compareTo 方法相结合。
但是,由于它已在 Java 9 中修复,因此我没有必要研究为什么会发生这种情况!
作为 Java9 发布之前的解决方法,我们可以更新我们的系统,我们手动实现了一个仅使用 getTime()
的 Comparator
。这似乎工作正常。
这是可用于重现问题的代码:
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.junit.Test;
public class TimSortDateAndTimestampTest {
// the same test data with all Dates, all Timestamps, all Strings or all Longs does NOT fail.
// only fails with mixed Timestamp and Date objects
@Test
public void testSortWithTimestampsAndDatesFails() throws Exception {
List<Date> dates = new ArrayList<>();
dates.add(new Timestamp(1498621254602L));
dates.add(new Timestamp(1498621254603L));
dates.add(new Timestamp(1498621254603L));
dates.add(new Timestamp(1498621254604L));
dates.add(new Timestamp(1498621254604L));
dates.add(new Timestamp(1498621254605L));
dates.add(new Timestamp(1498621254605L));
dates.add(new Timestamp(1498621254605L));
dates.add(new Timestamp(1498621254605L));
dates.add(new Timestamp(1498621254606L));
dates.add(new Timestamp(1498621254607L));
dates.add(new Date(1498621254605L));
dates.add(new Timestamp(1498621254607L));
dates.add(new Timestamp(1498621254609L));
dates.add(new Date(1498621254603L));
dates.add(new Date(1498621254604L));
dates.add(new Date(1498621254605L));
dates.add(new Date(1498621254605L));
dates.add(new Date(1498621254607L));
dates.add(new Timestamp(1498621254607L));
dates.add(new Date(1498621254608L));
dates.add(new Timestamp(1498621254608L));
dates.add(new Date(1498621254611L));
dates.add(new Timestamp(1498621254612L));
dates.add(new Timestamp(1498621254613L));
dates.add(new Date(1498621254607L));
dates.add(new Timestamp(1498621254607L));
dates.add(new Timestamp(1498621254608L));
dates.add(new Timestamp(1498621254609L));
dates.add(new Timestamp(1498621254611L));
dates.add(new Date(1498621254603L));
dates.add(new Date(1498621254606L));
for (int i = 0; i < 200; i++) {
Collections.shuffle(dates);
Collections.sort(dates);
}
}
}
编辑:我已经删除了异常预期,因此您可以看到它在运行时抛出。
关于java.lang.IllegalArgumentException : Comparison method violates its general contract! java.util.Date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31274578/
我有六个字符串变量,即 str11、str12、str13、str21、str21 和 str23。 我需要比较这些变量的组合。 我必须检查的组合是 str11 -- str12 -- str13 作
场景:我为各自的“节头”(存储为字符串)执行了一些任务,该任务的结果必须针对相同的相应“现有节头”(存储为字符串)保存 如果相应任务的“Section Header”是“现有 Section Head
我创建了一个类如下: public class StringMatch { public int line_num; public int num_of_words; } 我已经创建了一个
有没有人在使用 Pandas 时解决了这个 pylint 问题? C:525,59: Comparison to True should be just 'expr' or 'expr is True
关注 Arthur's suggestion ,我换了我的Fixpoint相互的关系 Inductive关系“建立”了游戏之间的不同比较,而不是“深入研究”。 但现在我收到一条全新的错误消息: Err
计算机如何执行值相等比较?它是否从最小的位开始逐位比较值,并在遇到两个不同的位时停止?还是从最高位开始?无论在何处/何时找到两个不同的位,它都会遍历所有位吗? 最佳答案 当您用高级语言(例如 c)编写
在这个例子中, > (= 1 1) #t > (= 'a 'a) *** ERROR IN (console)@2.1 -- (Argument 1) NUMBER expected (= 'a 'a
这是我的一个个人项目,我不知道从哪里开始,因为它远远超出了我的舒适区。 我知道有一些语言学习软件可以让用户记录他或她的声音并将发音与该语言的母语者进行比较。 我的问题是,如何实现这一目标? 我的意思是
我需要比较使用相同的编译器/标志进行编译的2个可执行文件和/或共享对象,并确认它们没有更改。我们在一个受监管的环境中工作,因此对于准确地确定可执行文件的哪些部分已发生更改,对于进行测试非常有用。 由于
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有两个字符缓冲区,我正在尝试比较它们的一部分。我有一个奇怪的问题。我有以下代码: char buffer1[50], buffer2[60]; // Get buffer1 and buffer2
问题的澄清/总结——我们正在寻找: 托管错误跟踪系统, 使用起来和 lighthouse/github/launchpad 一样方便, 可以处理附件, 集成电子邮件通知和操作(在提交消息中隐含操作),
我相信 Stackoverflow 上有很多软件测试工程师、算法验证工程师。有人可以告诉我在以下情况下如何进行。 假设我们有一个乳房 X 线照片和 5 种不同的算法,这些算法将这个乳房 X 光照片作为
我已经开始阅读Algorithms了,我一直想知道,当处理相同类型的基元时,哪个是更昂贵的操作,赋值或比较?语言之间的差异是否很大? 最佳答案 微观优化几乎总是错误的做法。除非程序运行太慢,否则不要启
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。 Improve this
我在这里看到了一些与确定文件相似性相关的问题,但它们都与特定域(图像、声音、文本等)相关联。作为解决方案提供的技术需要了解所比较文件的基础文件格式。我正在寻找的是一种没有此要求的方法,其中可以比较任意
我需要比较两个 var -> integer 形式的规则列表,以了解不匹配的情况。 判断是否存在lhs相同而rhs不同的规则。 例如: {a->3, b->1, c->4} ~ ??? ~ {a->3
我看到了 MEF 和 Lua 之间的相似之处。两者都允许您注册方法并根据需要进行部署。 MEF 和 Lua 都是 IoC/依赖注入(inject)的形式吗? 最佳答案 我假设您了解这些技术之间的巨大差
我找到了 Digital persona Finger FX 开源项目,它允许我提供指纹图像(位图)并将指纹细节数据保存在 ISO/IEC 19794-2:2005 中 格式。 https://git
ImageMagick库中是否有任何相等谓词函数?我想比较两个图像,并找出它们是否完全相同(像素的所有颜色都相同)或有什么不同。 我环顾四周,但似乎没有这样的功能。我应该自己使用像素迭代器编写函数吗?
我是一名优秀的程序员,十分优秀!