请有人建议以下问题的最佳解决方案(这是我尝试编写的程序的一部分):
我有一个带有成员变量的类Foo和另一个扩展Foo的类Bar。 Bar添加了额外的成员变量。 Bar对象存储在一个集合中,因此我想通过它们的任何成员变量来排序这些对象。
我考虑使用包含可以作为参数传递给compareTo()方法的类的成员变量的枚举类型,但是由于枚举类型是隐式静态的,所以我不能为Bar或任何其他类的成员变量添加参数这可能会扩展我要比较的Foo。 例如,我想通过成员变量'myVar'比较两个Bar类,我会调用类似bar1.compareTo(bar2,MyEnum.MYVAR)的类,并将类与其myVar值进行比较。 我想我可能只需要创建单独的方法来按每个成员变量排序,但是想要使用compareTo(),因为Java集合使用它来自动对其项目进行排序(我相信)。
这就像我可以清楚地描述问题一样,但我可能会以完全错误的方式实现这一目标。任何指针都将非常感激。
编辑 - 这与在Windows资源管理器窗口中按不同属性排序列的行为类似,即修改日期,文件名,大小等。
答案 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());
}
}