java比较错误,在完成之前停止排序

时间:2014-03-04 03:07:58

标签: java arrays sorting comparable

我正在创建一个名为“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

如果需要,我可以提供更多代码,但我并没有做任何应该与之互动的事情。

3 个答案:

答案 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 javadocArray.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,独家

所以你要把最后一个元素排除在外。