我会比较使用compareTo
方法的对象的多个唯一字段。可能吗?比较compareTo中对象的更多字段
为istance:
public int compareTo(Object o) {
return field.compareTo(o.field);
}
我创建这个方法来排序的集合。显然我的对象必须实现Comparable
接口。
我猜如果可以比较不只一个字段在相同的方法compareTo
。
我会比较使用compareTo
方法的对象的多个唯一字段。可能吗?比较compareTo中对象的更多字段
为istance:
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;
}
这会很快得到麻烦,这就是为什么番石榴提供ComparisonChain
。使用示例:
public int compareTo(SomeClass o) {
return ComparisonChain.start()
.compare(field1, o.field1)
.compare(field2, o.field2)
.result();
}
也非常快速嵌套,为什么@ aix的解决方案应该是首选 –
@Simon:如果你有两个以上,你应该不会使用我的第一个解决方案或aix的;使用我列出的帮手。 –
是的,这是可能的,例如像这样:
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);
}
使用泛型时,除非出于某种非常奇怪的原因(如向后兼容性),否则它不会成为“Object”,您已经实现了'Comparable
重用这个变量有点讨厌。 –
你当然可以在其他领域的因素比较时,但通常有优先级的某种秩序,就像字母只排序看第二个字母,如果第一个是相同的:
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)
{
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
}
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)
方法,你可以用o.fields
比较this.fields
。如果你真的需要,你甚至可以比较this.a
到o.c
。点是你必须定义规则,在这种情况下objectA < objectB。等等。
当然。这是一个相对简明的做法。
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
,但本质上是任何字段类型,你可以比较相同)。
简洁,但你做了大部分比较两次。对于非基元来说这可能是不必要的昂贵。 –
在许多情况下,平等比较可能会快得多。如果您必须具有绝对最快的性能,请替换'(x
可能[通过多个字段比较对象的最佳方式?](http:// stackoverflow。com/questions/369512/best-way-to-compare-objects-by-multiple-fields) – blank