比较compareTo中对象的更多字段

时间:2011-12-13 15:07:34

标签: java compareto

我使用compareTo方法比较一个对象的多个字段。有可能吗?

for istance:

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

我创建此方法来对集合进行排序。显然我的对象必须实现Comparable接口。

我猜测是否可以比较同一方法compareTo中的一个字段。

7 个答案:

答案 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.fieldso.fields进行比较。如果确实需要,您甚至可以将this.ao.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字段abc,但是对于您可以比较的任何字段类型,基本相同。)

答案 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    
}