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;
}
这很快就会变得很麻烦,这就是为什么 Guava 提供了一个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
你甚至可以比较。o.c
关键是你必须定义规则,在这种情况下 objectA < objectB. ETC..
当然。这是一种相对简洁的方法。
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
}