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

标签 java arrays sorting comparable

我正在创建一个名为“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 javadocArray.sort(...) 方法的第三个参数是一个独占边界。如果 length 确实代表 Q 的长度...或 Q 中有效的条目数...那么您应该使用 length 作为第三个参数。

(线索是您的示例中只有最后一个元素排序不正确。)

关于java可比较错误,在完成之前停止排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22162064/

相关文章:

java - 使用默认时间戳将 Spark RDD 中的值放入相同的 HBase 列

java - 类属性的多种类型

arrays - 从 ruby​​ 中具有相同值的数组返回键

c - 在C中按字母顺序对链表进行排序

c - C 中的函数,实现两个 int 数组在另一个数组中的数学并集

java - 数据未通过 jtable 保存在数据库中(已编辑)

java - 如何从不同的线程使用 ApplicationContext session 范围的类

java - 在 Java 中返回一个对象

C 编程 - 将数组元素拆分为单独的字符

JAVASCRIPT 这是模拟 sort() 方法的好函数吗?