我可以使用带有第二个参数的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>的大多数类或函数也具有带有TComparator<T>的版本。一个示例是Collections.sort。另一个是TreeSet,它可以在构造时使用比较器。

如果这看起来令人讨厌或令人讨厌,请考虑如何使用该功能。假设您的函数采用T extends Comparable<T>。您尝试根据该item1.compareTo(item2)接口通过调用Comparable比较其中两个。如果您的代码已编译,则该方法将不存在!请注意,Java没有默认参数,因此没有办法说“如果它们未通过int order,则假定它为0”。

10-02 05:09