2015-09-27 196 views
0

我知道compareTo可以返回正的负值和零值。compareTo方法如何与array.sort一起对数组进行排序?

所以,如果我用

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()连接。 它甚至不会调用比较方法对其进行排序。 那么,是什么在compareTo()输入真的?我在哪里可以通过它,如果我不能调用此方法,当我用array.sort()

回答

3

这里是Arrays.sort(Object[])的Javadoc:指定对象按升序进行排列

排序,根据其元素的自然顺序。数组中的所有元素都必须实现Comparable接口。此外,阵列中的所有元素必须相互可比(,即e1.compareTo(e2)不得为阵列中的任何元素e1e2抛出ClassCastException)。

因此,排序方法依赖于数组元素的接口Comparable

+0

所以你的意思是,E1和E2必须是在同一个班? – ksdawq

+0

是的,或者是另一个的子类。 – blm

+0

@ksdawq不一定。只要元素实现“可比”。 – manouti

-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 
+0

但我只允许使用可比的界面。你可以在可比的界面中解释吗?谢谢 – ksdawq

+0

Comparable的javadocs非常好,你能解释一下你不明白的东西吗? – blm

+0

@blm我不明白我怎么能在compareTo()中传递参数,当它从来没有要求我调用compareTo时,我使用Array.sort – ksdawq

-1

一般来说,你会更好,创造一个比较,而不是实现媲美。然后,您可以传递到集合排序方法:

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

编辑:

阅读一些有机磷农药的意见后,我们可以证明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甲基OD正在从排序方法中调用,因为终端将展示我们的跟踪语句:

Before sort. 
In compareTo 
In compareTo 
In compareTo 
In compareTo 
In compareTo 
In compareTo 
In compareTo 
In compareTo 
In compareTo 
+0

你能解释一下:“你最好创建一个比较器而不是实现Comparable”。 – blm

+0

它的哪一部分? – jste89

相关问题