Java compareTo数组排序

时间:2015-01-04 04:23:40

标签: java arrays sorting compareto

我有两个班级MainObject。我需要根据数值按升序对数组中的对象进行排序。我从compareTo返回-1,1和0,我需要相应地运行for循环来对我的数组进行排序。我不想使用Arrays.sort,我需要手动完成。 Main类的排序部分不起作用。任何帮助都可能有用。谢谢。

public class Main {

public static void main(String[] args) {

    Object[] arr = new Object[6];

    arr[0] = new Object(2);
    arr[1] = new Object(5);
    arr[2] = new Object(3);
    arr[3] = new Object(1);
    arr[4] = new Object(6);
    arr[5] = new Object(4);

    System.out.println("List of instances");
    for (int i = 0; i < 5; i++) {
        System.out.println(arr[i].getValue());
    }

    System.out.println();

    Object tempVar;

    for (int i = 0; i < arr.length; i++) {

        for (int j = 0; j < 5; j++) {

            int result = arr[i].compareTo(arr[i]);

            if (result == -1) {
                tempVar = arr[j + 1];
                arr[j + 1] = arr[i];
                arr[i] = tempVar;
            }
        }
    }

    System.out.println("List of sorted instances");
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i].getValue());
    }

}

}

public class Object implements Comparable<Object> {

private int value;

public Object(int value) {
    this.value = value;
}

public int getValue() {
    return value;
}

public void setValue(int value) {
    this.value = value;
}

@Override
public int compareTo(Object o) {
    int result = 0;

    if (this.value > o.getValue()) {
        result = 1;
    } else if (this.value < o.getValue()) {
        result = -1;
    } else if (this.value == o.getValue()) {
        result = 0;
    }

    return result;
}

}

1 个答案:

答案 0 :(得分:0)

如果您想循环遍历集合中的所有元素,那么请不要使用5这样的固定值:

System.out.println("List of instances");
for (int i = 0; i < 5; i++) {

改为使用arr.length

这也适用于这一行:

for (int j = 0; j < 5; j++) {

5可能是正确的,因为数组长度为6并且您希望在最后一个索引之前终止,但是如果您使用更大的数组,此代码将会中断。使用arr.length - 1代替5


此行将数组元素与其自身进行比较:

int result = arr[i].compareTo(arr[i]);

因此result始终为0。将其更改为:

int result = arr[i].compareTo(arr[j]);

或:

int result = arr[j].compareTo(arr[i]);

尝试两种方法来查看它们之间的区别。


在上述修复中,您需要比较索引ij上的元素。因此,您应该更改此代码:

if (result == -1) {
    tempVar = arr[j + 1];
    arr[j + 1] = arr[i];
    arr[i] = tempVar;
}

使用j的正确索引:

if (result == -1) {
    tempVar = arr[j];
    arr[j] = arr[i];
    arr[i] = tempVar;
}

您当前的代码会比较ij的元素(嗯,不是j,因为这个bug,但您的意思是这样),但是由于不同而交换了不同的元素index j+1