0

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

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

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

我可以清楚地描述这个问题,但我可能会以完全错误的方式实现这一目标。任何指针将不胜感激。

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

4

2 回答 2

4

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

如果您想拥有多个比较器或只有一个,这取决于您,但如果您想基于多个字段进行复杂的比较,我建议您为此创建一个特定的比较器。

于 2012-12-07T20:17:03.713 回答
1

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

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

此外,如果您需要不同的比较器方法(例如升序降序,按属性),然后定义一个 Comparator :(不幸。我没有打开 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());
      }
    }
于 2012-12-07T20:13:13.060 回答