compareTo方法如何与array.sort一起对数组进行排序?

时间:2015-09-27 17:33:38

标签: java arrays sorting compareto

我知道compareTo可以返回正负值和零值。

所以,如果我使用

public class x implements Comparable <Object O> {/*...*/}

并在内部分配

public int compareTo(int i) {       
    if (this.intg < i) { return -1; } 
    else if (this.intg > i) { return 1; } 
    else { return 0; }
}

我能以这种方式使用排序Array.sort(O[]objects)吗?

我不知道array.sort()compareTo()的关联。 它甚至不会调用compare方法对其进行排序。 那么compareTo()输入真正做了什么?如果我在使用array.sort()

时无法调用此方法,我可以在哪里传递它

3 个答案:

答案 0 :(得分:3)

这是Arrays.sort(Object[])的Javadoc:

  

根据元素的自然顺序,将指定的对象数组按升序排序。数组中的所有元素都必须实现Comparable接口。此外,数组中的所有元素必须具有可比性(e1.compareTo(e2)不得为数组中的任何元素ClassCastExceptione1抛出e2 /强>)。

因此sort方法确实依赖于数组元素的Comparable接口。

答案 1 :(得分:-1)

您可以使用Collections.sort方法对List个对象进行现场排序。第二个参数是您的Comparator实施。

示例:

List<Animal> animals = .. some ArrayList for example;
Comparator<Animal> comparator = new Comparator<Animal>() {
    public int compare(Animal d1, Animal d2) {
        int v1 = d1.intg;
        int v2 = d2.intg;

        return (v1 > v2 ? 1 : (v1 == v2 ? 0 : -1));
    }
};

Collections.sort(animals, comparator);

// the 'animals' collection is now sorted based on the `intg` property

答案 2 :(得分:-1)

通常,您最好创建一个Comparator而不是实现Comparable。然后,您可以将其传递给集合排序方法:

Collections.sort(myArrayList, new Comparator<MyObject>(){
     public int compare(MyObject o1, MyObject o2){
         return Integer.compare(o1.value == o2.value);
     }
});

编辑:

在阅读了一些OP评论之后,我们可以证明compareTo方法确实被调用了:

public class TestClass implements Comparable<TestClass> {
    private int value;

    public int getValue(){
        return this.value;
    }

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

    @Override
    public int compareTo(TestClass arg) {
        System.out.println("In compareTo");
        return Integer.compare(this.value, arg.value);
    }
}

如果我们再做以下事情:

    ArrayList<TestClass> a = new ArrayList<>();
    for( int i = 0; i < 10; i++ ){
        TestClass t = new TestClass();
        t.setValue(i);
        a.add(t);
    }

    System.out.println("Before sort.");
    Collections.sort(a);

我们将看到compareTo方法是从sort方法中调用的,因为终端将显示我们的trace语句:

Before sort.
In compareTo
In compareTo
In compareTo
In compareTo
In compareTo
In compareTo
In compareTo
In compareTo
In compareTo