2011-12-13 42 views
2

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

为istance:

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

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

我猜如果可以比较不只一个字段在相同的方法compareTo

+0

可能[通过多个字段比较对象的最佳方式?](http:// stackoverflow。com/questions/369512/best-way-to-compare-objects-by-multiple-fields) – blank

回答

3

是的,这是可能的。如果比较第一个字段的结果返回零,则返回比较第二个字段的结果。

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(); 
} 
+0

也非常快速嵌套,为什么@ aix的解决方案应该是首选 –

+2

@Simon:如果你有两个以上,你应该不会使用我的第一个解决方案或aix的;使用我列出的帮手。 –

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); 
} 
+0

使用泛型时,除非出于某种非常奇怪的原因(如向后兼容性),否则它不会成为“Object”,您已经实现了'Comparable '。 –

+0

重用这个变量有点讨厌。 –

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... 
} 
-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  
} 
+3

您正在返回一个布尔值而不是int。这是非常错误的。 –

+0

@ TomHawtin-tackline:谢谢。更新。 – Azodious

+1

它仍然没有任何意义。 –

0
public int compareTo(Object o){ 
    int res = field.compareTo(o.field); 
    if(res==0) 
    res=field1.compareTo(o.field1); 
    return res; 
} 

应该工作

0

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

例如

你有

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

compareTo(Object o)方法,你可以用o.fields比较this.fields。如果你真的需要,你甚至可以比较this.ao.c。点是你必须定义规则,在这种情况下objectA < objectB。等等。

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,但本质上是任何字段类型,你可以比较相同)。

+0

简洁,但你做了大部分比较两次。对于非基元来说这可能是不必要的昂贵。 –

+0

在许多情况下,平等比较可能会快得多。如果您必须具有绝对最快的性能,请替换'(x