簡體   English   中英

compareTo方法如何與array.sort一起對數組進行排序?

[英]How can the compareTo method work together with array.sort to sort an array?

我知道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; }
}

我可以通過這種方式使用sort Array.sort(O[]objects)嗎?

我不知道array.sort()compareTo() 它甚至不調用compare方法對其進行排序。 那么compareTo()輸入的真正作用是什么? 如果在使用array.sort()時無法調用此方法,可以在哪里傳遞它

這是Arrays.sort(Object[])的Javadocs:

根據對象的自然順序,將指定的對象數組按升序排序。 數組中的所有元素必須實現Comparable接口。 此外,數組中的所有元素必須相互可比較( 也就是說, e1.compareTo(e2)不得對數組中的任何元素e1e2拋出ClassCastException )。

因此,sort方法確實依賴於數組元素的Comparable接口。

您可以使用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

通常,您最好創建一個Comparator,而不是實現Comparable。 然后,您可以將其傳遞給Collections排序方法:

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);

我們將看到在sort方法中正在調用compareTo方法,因為終端將顯示我們的trace語句:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM