2013-10-27 26 views
3

我只想知道Comparator使用哪種排序技術來排序事物。並且即使我們從不明確調用此方法,也會調用它的方法compare()。 例如可以說我有類比較器在內部使用哪種比較值以及它如何調用其比較方法?

class Person{ 
    int age; 
    int personId; 

    //..getters and setters goes here 
} 

我有另一個類SortPerson

class SortPerson implements Comparator<Person>{ 
    public int compare(){ 
     //sorting logic goes here 
     //Assume that I am sorting according to person age. 
    }  
}  

在我的主類我使用的PriorityQueue

class Main{ 
    public void main(...){ 
    Queue<Person> q = new PriorityQueue<Person>(5, new SortPerson()); 
    //q.add() and q.poll() operations goes here 
    } 
} 

的比較是那麼究竟怎麼了在執行添加和輪詢操作時調用以維護正確的排序順序? 謝謝。

+0

源代碼將更好地回答這個問題。 –

+0

「比較器」不使用任何排序技術。它是執行排序的'PriorityQueue'(等)。 –

+0

@Oli Charlesworth:是嗎?但是如果我想按相反順序排序,那麼我通常只在'compare()'方法中寫這個邏輯。那麼,如果PriorityQueue完成所有排序,我們爲什麼要使用Comparator呢?請詳細說明,這確實會有幫助。 – Winn

回答

4

compare方法並不真正分類的東西。那麼,從技術上來說,它確實是對兩個對象進行排序的退化情況,但是在計算機科學中爲了避免混淆,我們通常只是稱之爲比較而已,而不是一種排序。

由於這是您的班級,因此您有責任實施compare方法,使用您認爲合適的任何比較邏輯。然而,爲了明智起見,該比較邏輯必須遵循在Comparator接口中用於該方法的Javadoc中的約束條件。

您正在使用的集合類(在本例中爲PriorityQueue)將根據需要將對象插入集合中正確位置所需的儘可能多的對象上調用compare方法。但是,不要對將要比較哪些對象作出任何假設。您的compare方法應該可以正常工作,對於任何對對象 - 即使是由對象和自身組成的對。

+0

那麼它每次調用add/poll動作(在PriorityQueue的情況下)都會調用'compare()'方法嗎?我的意思是它在每個事件中創建Comparator類的新實例(在這種情況下是SortPerson)? – Winn

+1

是的,它調用'add'中的'compare' - 事實上,它會在它自己走路時多次調用它,試圖找到插入的正確位置。但是,不,它不會創建新的實例 - 它不能,也不需要。至於'poll',我不認爲需要比較,因爲隊列已經排序。也許你並不完全瞭解隊列總是按排序順序保存的事實。 –

+0

非常感謝@Robin Green對你的很好的解釋。 – Winn