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

Java 如何对单个指定的成员变量使用compareTo(),java,compareto,Java,Compareto,请有人提出以下问题的最佳解决方案(这是我试图编写的程序的一部分): 我有一个带有成员变量的类Foo和另一个扩展Foo的类栏。Bar添加额外的成员变量。Bar对象存储在一个集合中,因此,我想按其成员变量对这些对象进行排序 我考虑过使用一个枚举类型,该类型包含可以作为参数传递给compareTo()方法的类的成员变量,但由于枚举类型是隐式静态的,因此我无法为Bar的成员变量或任何其他可能扩展要比较的Foo的类添加参数。 例如,我想通过成员变量“myVar”比较两个Bar类,我将调用类似于bar1.c

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

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

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

这是我所能描述的最清楚的问题,但我可能会以完全错误的方式实现这一点。任何指点都将不胜感激


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

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

class Bar {
  Foo foo;
  String barName;
  public getName() { return barName; }
}
此外,如果需要不同的比较器方法(例如,升序-降序、按属性),请定义比较器: (不幸的是,我没有打开Eclipse,如果语法失败,请更正)

公共类BarComparator实现Comparator{
@凌驾
公共整数比较(b1栏、b2栏){
if(b1.getName()==null&&b2.getName()==null){
返回0;
}
if(b1.getName()==null){
返回1;
}
if(b2.getName()==null){
返回-1;
}
返回b1.getName().compareTo(b2.getName());
}
}

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

class Bar {
  Foo foo;
  String barName;
  public getName() { return barName; }
}
此外,如果需要不同的比较器方法(例如,升序-降序、按属性),请定义比较器: (不幸的是,我没有打开Eclipse,如果语法失败,请更正)

公共类BarComparator实现Comparator{
@凌驾
公共整数比较(b1栏、b2栏){
if(b1.getName()==null&&b2.getName()==null){
返回0;
}
if(b1.getName()==null){
返回1;
}
if(b2.getName()==null){
返回-1;
}
返回b1.getName().compareTo(b2.getName());
}
}
最好使用一个函数来封装这个特定的比较逻辑。您可以进行尽可能多的
Comparator
对象比较,或者根据建议,让
Comparator
根据确定的字段进行比较

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

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



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

Ummmm….
compareTo
只接受一个参数。为什么不在
Bar
中重写
compareTo
?我已经在重写Bar中的compareTo,我的问题是按指定的成员变量对Bar集合进行排序。我想一些代码片段可能会提高问题的可读性和清晰度。无论如何,这是一个好的开始,是你的第一个问题。
compareTo
不排序<代码>比较到比较。使用
sort
进行排序。Ummmm….
compareTo
只接受一个参数。为什么不在
Bar
中重写
compareTo
?我已经在重写Bar中的compareTo,我的问题是按指定的成员变量对Bar集合进行排序。我想一些代码片段可能会提高问题的可读性和清晰度。无论如何,这是一个好的开始,是你的第一个问题。
compareTo
不排序<代码>比较到比较。使用
sort
进行排序。您还可以创建一个比较器,该比较器在其构造函数中接受一个参数,该参数指定在比较中使用哪个字段。这样,您只需要一个比较器,就可以使用它按不同字段进行排序。@只要它实现了
Comparator
接口,就不会造成任何损害。唯一的问题是,您必须检查要使用的字段,这会使代码更加复杂。还有一种情况是,比较并不是那么简单,或者存在基于多个字段的比较。无论如何,这是一个很好的观点。如果每个可能的排序字段都实现可比较的,那么它将非常有效。显然,在某些情况下,实现它并不是件小事。这里有一个答案提供了一个例子:我知道你的意思。我并不反对为简单字段使用比较器的想法,但IMO为其他复杂的比较器提供了特殊的额外比较器,这将使代码更加干净。是的。根本不争论那一点。多比较器是一个很好的解决方案。话虽如此,这里还有一个链接显示了动态比较器的示例:您可以