如何对单个指定的成员变量使用compareTo()

时间:2012-12-07 20:11:37

标签: java compareto

请有人建议以下问题的最佳解决方案(这是我尝试编写的程序的一部分):

我有一个带有成员变量的类Foo和另一个扩展Foo的类Bar。 Bar添加了额外的成员变量。 Bar对象存储在一个集合中,因此我想通过它们的任何成员变量来排序这些对象。

我考虑使用包含可以作为参数传递给compareTo()方法的类的成员变量的枚举类型,但是由于枚举类型是隐式静态的,所以我不能为Bar或任何其他类的成员变量添加参数这可能会扩展我要比较的Foo。 例如,我想通过成员变量'myVar'比较两个Bar类,我会调用类似bar1.compareTo(bar2,MyEnum.MYVAR)的类,并将类与其myVar值进行比较。 我想我可能只需要创建单独的方法来按每个成员变量排序,但是想要使用compareTo(),因为Java集合使用它来自动对其项目进行排序(我相信)。

这就像我可以清楚地描述问题一样,但我可能会以完全错误的方式实现这一目标。任何指针都将非常感激。

编辑 - 这与在Windows资源管理器窗口中按不同属性排序列的行为类似,即修改日期,文件名,大小等。

2 个答案:

答案 0 :(得分:4)

最好使用Comparator来封装这种特定的比较逻辑。您可以根据需要对尽可能多的Comparator个对象进行比较,或者根据建议,Comparator根据确定的字段进行比较。

如果你想拥有多个比较器或只有一个,这取决于你,但如果你想根据多个领域进行复杂的比较,我建议你为它创建一个特定的比较器。

答案 1 :(得分:1)

使用继承实现compareTo非常棘手。你最好不要这样做。使用聚合,你没有问题:

class Bar {
  Foo foo;
  String barName;
  public getName() { return barName; }
}

此外,如果您需要不同的比较器方法(例如按属性递增降序),则定义比较器: (不幸的是。我没有打开Eclipse,如果语法失败,请更正)

public class BarComparator implements Comparator<Bar> {

      @Override
      public int compare(Bar b1, Bar b2) {
        if (b1.getName() == null && b2.getName() == null) {
          return 0;
        }
        if (b1.getName() == null) {
          return 1;
        }
        if (b2.getName() == null) {
          return -1;
        }
        return b1.getName().compareTo(b2.getName());
      }
    }