我有list
个实现Comparable
的对象。
我想对此列表进行排序,这就是我使用Comparable
的原因。
每个对象都有一个字段weight
,由3个其他成员int变量组成。
compareTo
为1
的对象返回weight
<= p>最重要的不仅仅是
weightObj1.member1 > weightObj2.member1
weightObj1.member2 > weightObj2.member2
weightObj1.member3 > weightObj2.member3
但实际上有点复杂,我最终得到的条件有太多条件ifs。
如果weightObj1.member1 > weightObj2.member1
成立,那么我关心的是weightObj1.member2 > weightObj2.member2
。
反之亦然。
如果weightObj1.member2 > weightObj2.member2
成立,那么我关心weightObj1.member3 > weightObj2.member3
,反之亦然。
最后如果weightObj1.member3 > weightObj2.member3
成立并且如果满足特定条件则此weightObj1
获胜,反之亦然
我想知道有这样的设计方法吗?
答案 0 :(得分:6)
您可以尝试使用Apache commons-lang
中的CompareToBuilder
:
public int compareTo(Object o) {
MyClass myClass = (MyClass) o;
return new CompareToBuilder()
.appendSuper(super.compareTo(o)
.append(this.field1, myClass.field1)
.append(this.field2, myClass.field2)
.append(this.field3, myClass.field3)
.toComparison();
}
答案 1 :(得分:3)
与上面提到的Apache CompareToBuilder类似,但包括泛型支持,Guava提供ComparisonChain:
public int compareTo(Foo that) {
return ComparisonChain.start()
.compare(this.aString, that.aString)
.compare(this.anInt, that.anInt)
.compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
// you can specify comparators
.result();
}
答案 2 :(得分:1)
强烈建议(尽管不要求)自然 排序与平等一致。
由于感兴趣的值是int
值,您应该能够提供一个值来捕获比较两个对象所需的所有比较和其他转换。只需在任何成员值更改时更新单个值。
答案 3 :(得分:0)
您可以尝试使用反射,迭代属性并比较它们。
答案 4 :(得分:0)
您可以尝试这样的事情:
int c1 = o1.m1 - o2.m1;
if (c1 != 0) {
return c1;
}
int c2 = o1.m2 - o2.m2;
if (c2 != 0) {
return c2;
}
return o1.m3 - o2.m3;
因为可比较不应该只返回-1,0或1.它可以返回任何整数值,只考虑符号。