ComparisonChain有多种排序方式?

时间:2014-05-14 07:50:40

标签: java guava

我正在使用这个example来玩比较链。但它只是显示了一种对这些对象进行排序的方法。

  public class Fruit implements Comparable<Fruit> {
  private String name;
  private String family;
  private int calories;

  @Override
  public int compareTo( Fruit otherFruit ) {
    return ComparisonChain.start()
      .compare( name, otherFruit.name )
      .compare( family, otherFruit.family )
      .compare( calories, otherFruit.calories )
      .result();
  }
}

我现在想知道是否可以根据最终用户的需求进行排序。如果排序标准没有修复,我将如何实施?例如。有人想先按名称排序,然后按卡路里进行排序。下一个想要按家庭排序,然后按卡路里排序,然后按名称排序。等等。人们可能也想要降序而不是升序。

有人可以给我一些如何解决的提示吗?

1 个答案:

答案 0 :(得分:1)

Comparable应该实现一种比较方式。允许更改它实际上违反了Comparable的合同,这要求所有sgn(x.compareTo(y)) == -sgn(y.compareTo(x))x(引用Javadoc)y。如果您可以更改单个Fruit个对象使用的比较,则可以让对象x表示它大于y,而y表示它大于{{1} }}, 等等。想象一下,如果你有一个x包含的对象,每个对象都配置为使用不同的排序顺序...尝试排序该列表只会是混乱而不会产生任何有用的东西。

如果您想要多种替代排序方式,请创建List<Fruit>以实现上述每种方式,并以某种方式将其公开给用户。然后可以将单个Comparator传递给sort方法(或Comparator构造函数,或其他),确保所有比较都使用该逻辑。