如何用不同的变量对对象进行排序?

时间:2013-11-29 06:55:44

标签: java sorting comparable compareto

我可以使用带有第二个参数的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
    }
}

3 个答案:

答案 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}}