2

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

例如:

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

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

我猜是否可以在同一方法中不仅比较一个字段compareTo

4

7 回答 7

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();
}
于 2011-12-13T15:10:15.777 回答
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);
}
于 2011-12-13T15:10:41.043 回答
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...
}
于 2011-12-13T15:11:52.737 回答
0
public int compareTo(Object o){
  int res = field.compareTo(o.field);
  if(res==0)
    res=field1.compareTo(o.field1);
  return res;
}

应该管用

于 2011-12-13T15:14:13.420 回答
0

你当然可以。但是您必须定义比较规则。

例如

你有

objectA{a=1;b=2;c=3}
objectB{a=20;b=1;c=6}

在您的compareTo(Object o)方法中,您可以this.fieldso.fields. 如果你真的需要,this.a你甚至可以比较。o.c关键是你必须定义规则,在这种情况下 objectA < objectB. ETC..

于 2011-12-13T15:14:32.750 回答
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, 但对于您可以比较的任何字段类型基本上相同。)

于 2011-12-13T15:14:39.660 回答
-1

您可以通过以下任何方式执行此操作:

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    
}
于 2011-12-13T15:12:16.767 回答