我可以使用带有第二个参数的compareTo()方法来按不同的变量对对象进行排序,还是应该使用其他方法?
例如:
public class Girl implements Comparable<Girl> {
private String fName;
private String lName;
private int hotness;
public Girl () {} // blah blah constructor
@Override
public int compareTo (Girl g, int order) {
if (order == 1) // then sort by first name
if (order == 2) // then sort by last name
if (order == 3) // then sort by hotness
}
}
答案 0 :(得分:2)
@Override
注释说必须在超类或接口中声明compareTo(Girl, int)
,但事实并非如此! Comparable<Girl>
仅定义compareTo(Girl)
。
相反,您应该为每个订单使用Comparator<Girl>
。这是一个提供自己的compareTo
的班级,需要两个女孩。然后,您可以创建不同的比较器,并将适当的比较器传递给需要它的函数。换句话说,从order
中删除Girl
字段,而不是将不同的排序实现为Comparator<Girl>
的不同实例。
大多数使用T extends Comparable<T>
的类或函数的版本都采用T
和 a Comparator<T>
。其中一个例子是Collections.sort
。另一个是TreeSet
,可以在施工时采用比较器。
如果这看起来很烦人或迂腐,请考虑一下如何使用这样的功能。假设您的函数需要T extends Comparable<T>
。您尝试根据item1.compareTo(item2)
接口调用Comparable
来比较其中两个。如果您的代码编译,该方法将不存在!请注意,Java没有默认参数,因此无法说“如果它们没有传入int order
,则假设它为0。”
答案 1 :(得分:1)
您没有覆盖compareTo
方法,而是重载它。使用@Override
进行标记将不允许编译该类。
使用多个Comparator
类根据不同的方案比较Girls
。
答案 2 :(得分:0)
不,您尝试做的事情将无效,因为您没有覆盖compareTo()
方法。这里的替代解决方案可以是使用Collections.sort()
使用自定义比较器对集合进行排序,并使用其中的order
变量(必须使final
能够在void inSomeMethod() {
final int order = 0; // has to be final
Collections.sort(new ArrayList<Girl>(), new Comparator<Girl>() { // for example
@Override
public int compare(Girl o1, Girl o2) {
if (order == 1) // then sort by first name
if (order == 2) // then sort by last name
if (order == 3) // then sort by hotness
return 0;
}
});
}
中使用它那)。这样的事情。
{{1}}