我使用compareTo
方法比较一个对象的多个字段。有可能吗?
for istance:
public int compareTo(Object o) {
return field.compareTo(o.field);
}
我创建此方法来对集合进行排序。显然我的对象必须实现Comparable
接口。
我猜测是否可以比较同一方法compareTo
中的一个字段。
答案 0 :(得分:3)
是的,这是可能的。如果比较第一个字段的结果返回零,则返回比较第二个字段的结果。
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();
}
答案 1 :(得分: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);
}
答案 2 :(得分: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...
}
答案 3 :(得分:0)
public int compareTo(Object o){
int res = field.compareTo(o.field);
if(res==0)
res=field1.compareTo(o.field1);
return res;
}
应该有效
答案 4 :(得分:0)
e.g。
你有
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<对象B。等。
答案 5 :(得分: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
字段a
,b
,c
,但是对于您可以比较的任何字段类型,基本相同。)
答案 6 :(得分:-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
}