我可以使用带有第二个参数的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
}
}
最佳答案
不,你不能。您会发现代码无法编译-@Override
注释指出compareTo(Girl, int)
必须在超类或接口中声明,但不是! Comparable<Girl>
仅定义compareTo(Girl)
。
而是,应为每个顺序使用Comparator<Girl>
。这是一个提供自己的compareTo
的类,需要两个女孩。然后,您可以创建不同的比较器,并将适当的比较器传递给需要它的函数。换句话说,从order
中删除Girl
字段,而是将不同的顺序实现为Comparator<Girl>
的不同实例。
带有T extends Comparable<T>
的大多数类或函数也具有带有T
和Comparator<T>
的版本。一个示例是Collections.sort
。另一个是TreeSet
,它可以在构造时使用比较器。
如果这看起来令人讨厌或令人讨厌,请考虑如何使用该功能。假设您的函数采用T extends Comparable<T>
。您尝试根据该item1.compareTo(item2)
接口通过调用Comparable
比较其中两个。如果您的代码已编译,则该方法将不存在!请注意,Java没有默认参数,因此没有办法说“如果它们未通过int order
,则假定它为0”。