[英]compare more field of a object in compareTo
我將使用compareTo
方法比較一個對象的多個字段。 可能嗎?
出於目的:
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();
}
是的,有可能這樣,例如:
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);
}
進行比較時,您當然可以考慮其他字段,但是通常有一些優先順序,就像按字母順序排序時,如果第一個字母相同,則只看第二個字母:
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){
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)
方法中,可以將this.fields
與o.fields
進行比較。 如果確實需要,您甚至可以將this.a
與oc
進行比較。 關鍵是您必須定義規則,在這種情況下,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
,但是對於您可以比較的任何字段類型基本上都是相同的。)
您可以通過以下任何一種方式來做到這一點:
public int compareTo(Object o)
{
return (field.compareTo(o.field)==1 && field2.compareTo(o.field2)==0)? 0 : 1;
}
要么
public int compareTo(Object o)
{
// add various if-else blocks
// OR
// call a separate method
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.