我正在创建一个名为“Job”的对象,我后来想要根据每个任务需要多长时间来对其进行排序(将此变量命名为“time”)。在作业课程中,我按照两个教程的建议扩展了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()));
}
取决于我评论出来。两个实现都编译,但产生相同的错误,如下所示。
在我的main方法中,我创建了几个作业并将它们添加到一个作业数组Q []中,还创建了一个int(长度)来跟踪多少个数组是非空的 - 有多少实际作业在Q值。
然而,当我用
对它们进行排序时Arrays.sort(Q, 0, length-1);
它只会排序,直到它发现'next'对象大于当前对象。这是我最近两次测试的结果,(工作名称;工作时间):
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
如果需要,我可以提供更多代码,但我并没有做任何应该与之互动的事情。
答案 0 :(得分:1)
首先,这些compareTo方法都不是(完全)正确的:
public int compareTo(Job t) {
int compare = ((Job) t).time;
return this.time - compare;
}
如果time
值可能为负数,则减法可能会溢出,从而导致数字符号错误。
public int compareTo(Job t) {
return new Integer(getTime()).compareTo((t.getTime()));
}
创建和Integer
实例是不必要的(并且浪费)。请改用静态Integer.compare(int, int)
方法。
但这些问题都没有解释你所看到的结果。
我的猜测是真正的问题只是length - 1
不正确。
根据the javadoc,Array.sort(...)
方法的第3个参数是独占绑定。如果length
确实代表Q
的长度...或Q
中有效的条目数...那么您应该使用length
作为第三个参数。
(线索是它只是你的例子中错误排序的最后一个元素。)
答案 1 :(得分:0)
不要使用int / Integer作为时间,使用long / Long
答案 2 :(得分:0)
您使用错误的Arrays.sort(a,fromIndex,toIndex)
:
toIndex
您应该致电Arrays.sort(Q, 0, length);
不是Arrays.sort(Q, 0, length-1);
检查:http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(byte[], int, int)
范围 要排序的索引从索引fromIndex(包括)扩展到索引 toIndex,独家。
所以你要把最后一个元素排除在外。