2012-09-17 115 views
4

我只有類文件,沒有在java中的源代碼,現在我必須對它們進行排序,我應該使用Comparator或Comparable?Java比較器和可比較

感謝您的幫助。

+0

可能不必做。 javap來查看類是否實現了Comparable。 – Sridhar

+0

可能重複的[何時使用Comparable vs Comparator](http://stackoverflow.com/questions/2266827/when-to-use-comparable-vs-comparator) – BalusC

回答

4

Comparable是一個由類實現的接口,這些類知道如何將自身與該類的另一個實例進行比較。

Comparator是用於比較不同類別的兩個實例的接口。

如果您有Person分類,例如

public class Person implements Comparable<Person> { 
    private final String firstName; 
    private final String lastName; 

    ... 

    public int compareTo(Person that) { 
     int rv = lastName.compareTo(that.lastName); 
     if (rv == 0) 
     rv = firstName.compareTo(that.firstName); 
     return rv; 
    } 
} 

這是按姓氏具有的自然排序,然後按名字的一類,即斯蒂芬·瓊斯談到約翰·史密斯之前。

如果當時就想先名字,然後姓氏,如John Smith所涉及的Stephen Jones之前,你可以使用一個比較

public class PersonComparator implements Comparator<Person> { 
    public int compare(Person p1, Person p2) { 
     int rv = p1.getFirstName().compareTo(p2.getFirstName()); 
     if (rv == 0) 
     rv = p1.getLastName().compareTo(p2.getLastName()); 
     return rv; 
    } 
} 

您使用這些對象進行排序,取決於什麼控制你有過類和實例。例如,如果您有一個不實現Comparable的類,但是您可以對其進行子類化以實現該界面,並且您確信自己將是唯一創建實例的人,則可以使用Comparable

但是,一般來說,Comparator更靈活。

+0

感謝Stephon..Nice的解釋。 – Swapnal

0

如果您無權訪問源文件,請使用Comparator對其進行排序。

​​
0

如果可能的話,你可以擴展類,並用一個新的類,它實現可比,這樣就可以實現的compareTo()。在其他情況下,您可以使用比較器作爲給定的,

class MyComparator implements Comparator<MyClass>{ 

    @Override 
    public int compare(MyClass o1, MyClass o2) { 
     return o1.getType().compareTo(o2.getType()); 
    } 
} 

使用比較器爲您提供了更多所需的定製。

0

簡單的答案

轉到爲比較

的兩個概念

(從http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html萃取)

可比

甲可比對象能夠本身與另一個對象進行比較的綜述。類本身必須實現java.lang.Comparable接口,以便能夠比較它的實例。

比較

比較器對象能夠比較兩個不同的對象。該類不是比較它的實例,而是一些其他類的實例。這個比較器類必須實現java.util.Comparator接口。

考慮您現有的類

您的當前課程已經實施。即使它已經有一個可比較的實現,你也不知道這個比較是如何實現的;因此你無法預測你的排序。如果您沒有修改要嘗試排序的類的源,唯一的選擇是使用Comparator。