2011-12-13 24 views
2

我會比較使用compareTo方法的對象的多個唯一字段。可能嗎?比較compareTo中對象的更多字段

爲istance:

public int compareTo(Object o) { 
    return field.compareTo(o.field); 
} 

我創建這個方法來排序的集合。顯然我的對象必須實現Comparable接口。

我猜如果可以比較不只一個字段在相同的方法compareTo

+0

可能[通過多個字段比較對象的最佳方式?](http:// stackoverflow。com/questions/369512/best-way-to-compare-objects-by-multiple-fields) – blank

回答

3

是的,這是可能的。如果比較第一個字段的結果返回零,則返回比較第二個字段的結果。

public int compareTo(SomeClass o) { 
    int result = field1.compareTo(o.field1); 
    if (result == 0) { 
     result = field2.compareTo(o.field2); 
    } 
    return result; 
} 

這會很快得到麻煩,這就是爲什麼番石榴提供ComparisonChain。使用示例:

public int compareTo(SomeClass o) { 
    return ComparisonChain.start() 
     .compare(field1, o.field1) 
     .compare(field2, o.field2) 
     .result(); 
} 
+0

也非常快速嵌套,爲什麼@ aix的解決方案應該是首選 –

+2

@Simon:如果你有兩個以上,你應該不會使用我的第一個解決方案或aix的;使用我列出的幫手。 –

3

是的,這是可能的,例如像這樣:

public int compareTo(MyClass o){ 
    int ret = field1.compareTo(o.field1); 
    if (ret != 0) return ret; 
    ret = field2.compareTo(o.field2); 
    if (ret != 0) return ret; 
    ... 
    return fieldN.compareTo(o.fieldN); 
} 
+0

使用泛型時,除非出於某種非常奇怪的原因(如向後兼容性),否則它不會成爲「Object」,您已經實現了'Comparable '。 –

+0

重用這個變量有點討厭。 –

0

你當然可以在其他領域的因素比較時,但通常有優先級的某種秩序,就像字母只排序看第二個字母,如果第一個是相同的:

public int compareTo(Object o){ 

    int comparison = field.compareTo(o.field); 
    if (comparison != 0) 
     return comparison; 
    comparison = field2.compareTo(o.field2); 
    if (comparison != 0) 
     return comparison; 
    //etc... 
} 
-1

你可以做任何的下列方式:

public int compareTo(Object o) 
{  
    return (field.compareTo(o.field)==1 && field2.compareTo(o.field2)==0)? 0 : 1; 
} 

OR

public int compareTo(Object o) 
{ 
    // add various if-else blocks 
    // OR 
    // call a separate method  
} 
+3

您正在返回一個布爾值而不是int。這是非常錯誤的。 –

+0

@ TomHawtin-tackline:謝謝。更新。 – Azodious

+1

它仍然沒有任何意義。 –

0
public int compareTo(Object o){ 
    int res = field.compareTo(o.field); 
    if(res==0) 
    res=field1.compareTo(o.field1); 
    return res; 
} 

應該工作

0

當然可以。 但是您必須定義比較規則。

例如

你有

objectA{a=1;b=2;c=3} 
objectB{a=20;b=1;c=6} 

compareTo(Object o)方法,你可以用o.fields比較this.fields。如果你真的需要,你甚至可以比較this.ao.c。點是你必須定義規則,在這種情況下objectA < objectB。等等。

0

當然。這是一個相對簡明的做法。

public int compareTo(MyClass other) { 
    return 
     a!=other.a ? Integer.compare(a, other.a) : 
     b!=other.b ? Integer.compare(b, other.b) : 
        Integer.compare(c, other.c); 
} 

Integer.compare是從Java SE 7,但執行並不難。假設int領域abc,但本質上是任何字段類型,你可以比較相同)。

+0

簡潔,但你做了大部分比較兩次。對於非基元來說這可能是不必要的昂貴。 –

+0

在許多情況下,平等比較可能會快得多。如果您必須具有絕對最快的性能,請替換'(x