我會比較使用compareTo
方法的對象的多個唯一字段。可能嗎?比較compareTo中對象的更多字段
爲istance:
public int compareTo(Object o) {
return field.compareTo(o.field);
}
我創建這個方法來排序的集合。顯然我的對象必須實現Comparable
接口。
我猜如果可以比較不只一個字段在相同的方法compareTo
。
我會比較使用compareTo
方法的對象的多個唯一字段。可能嗎?比較compareTo中對象的更多字段
爲istance:
public int compareTo(Object o) {
return field.compareTo(o.field);
}
我創建這個方法來排序的集合。顯然我的對象必須實現Comparable
接口。
我猜如果可以比較不只一個字段在相同的方法compareTo
。
是的,這是可能的。如果比較第一個字段的結果返回零,則返回比較第二個字段的結果。
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();
}
也非常快速嵌套,爲什麼@ aix的解決方案應該是首選 –
@Simon:如果你有兩個以上,你應該不會使用我的第一個解決方案或aix的;使用我列出的幫手。 –
是的,這是可能的,例如像這樣:
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);
}
使用泛型時,除非出於某種非常奇怪的原因(如向後兼容性),否則它不會成爲「Object」,您已經實現了'Comparable
重用這個變量有點討厭。 –
你當然可以在其他領域的因素比較時,但通常有優先級的某種秩序,就像字母只排序看第二個字母,如果第一個是相同的:
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...
}
你可以做任何的下列方式:
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
}
public int compareTo(Object o){
int res = field.compareTo(o.field);
if(res==0)
res=field1.compareTo(o.field1);
return res;
}
應該工作
當然可以。 但是您必須定義比較規則。
例如
你有
objectA{a=1;b=2;c=3}
objectB{a=20;b=1;c=6}
在compareTo(Object o)
方法,你可以用o.fields
比較this.fields
。如果你真的需要,你甚至可以比較this.a
到o.c
。點是你必須定義規則,在這種情況下objectA < objectB。等等。
當然。這是一個相對簡明的做法。
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
領域a
,b
,c
,但本質上是任何字段類型,你可以比較相同)。
簡潔,但你做了大部分比較兩次。對於非基元來說這可能是不必要的昂貴。 –
在許多情況下,平等比較可能會快得多。如果您必須具有絕對最快的性能,請替換'(x
可能[通過多個字段比較對象的最佳方式?](http:// stackoverflow。com/questions/369512/best-way-to-compare-objects-by-multiple-fields) – blank