Java:实现可比较但有太多条件ifs。我该如何避免它们?

时间:2012-01-21 22:07:35

标签: java design-patterns if-statement comparator comparable

我有list个实现Comparable的对象。

我想对此列表进行排序,这就是我使用Comparable的原因。

每个对象都有一个字段weight,由3个其他成员int变量组成。

compareTo1的对象返回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获胜,反之亦然

我想知道有这样的设计方法吗?

5 个答案:

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

API for Comparable州:

  

强烈建议(尽管不要求)自然   排序与平等一致。

由于感兴趣的值是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.它可以返回任何整数值,只考虑符号。