我正在创建一个名为“Job”的对象,稍后我将按照每个任务所需的时间进行升序排序(将此变量命名为“time”)。在作业类(class)中,我按照两个教程的建议扩展了compareTo(),现在看起来像这样;
public int compareTo(Job t) {
int compare = ((Job) t).time;
return this.time - compare;
}
或者这个;
public int compareTo(Job t) {
return new Integer(getTime()).compareTo((t.getTime()));
}
取决于我注释掉的内容。两种实现都可以编译,但会产生相同的错误,如下所示。
在我的主要方法中,我创建了多个作业并将它们添加到作业数组 Q[] 中,同时创建了一个 int(长度)来跟踪数组中有多少非空 - Q 中有多少实际作业。
但是,当我对它们进行排序时
Arrays.sort(Q, 0, length-1);
它只会进行排序,直到发现“下一个”对象大于当前对象为止。这是我最近两次测试的结果,按(作业名称;作业时间):
jobA; 5,
jobB; 2,
jobC; 9,
jobD; 8.
sorting
jobB; 2,
jobA; 5,
jobC; 9,
jobD; 8.
<小时/>
jobA; 5
jobB; 2
jobC; 1
jobD; 8
sorting
jobC; 1
jobB; 2
jobA; 5
jobD; 8
如果需要,我可以提供更多代码,但我并没有真正做任何其他应该与之交互的事情。
最佳答案
首先,这些compareTo方法都不(完全)正确:
public int compareTo(Job t) {
int compare = ((Job) t).time;
return this.time - compare;
}
如果时间
值可能为负数,则减法可能会溢出,导致数字符号错误。
public int compareTo(Job t) {
return new Integer(getTime()).compareTo((t.getTime()));
}
创建和 Integer
实例是不必要的(而且是浪费的)。请改用静态 Integer.compare(int, int)
方法。
但是这些问题都无法解释您所看到的结果。
<小时/>我的猜测是,真正的问题只是length - 1
不正确。
根据the javadoc ,Array.sort(...)
方法的第三个参数是一个独占边界。如果 length
确实代表 Q
的长度...或 Q
中有效的条目数...那么您应该使用 length
作为第三个参数。
(线索是您的示例中只有最后一个元素排序不正确。)
关于java可比较错误,在完成之前停止排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22162064/