如何在一个班级中制作2个可比较的方法?

时间:2010-12-13 19:39:23

标签: java sorting collections comparable

我有一个类,我已经用一个属性对它进行排序。 现在我需要做另一件事,我需要创建另一种方法来对数据进行排序。 我该怎么做,所以我可以在两种方法之间做出选择。 我知道的唯一命令是Collections.sort,它将从我想要比较其数据的类中获取方法compareTo。

甚至可能吗?

3 个答案:

答案 0 :(得分:60)

您需要做的是实施自定义Comparator。然后使用:

Collections.sort(yourList, new CustomComparator<YourClass>());

具体来说,你可以写:(这将创建一个实现Comparator的匿名类。)

Collections.sort(yourList, new Comparator<YourClass>(){
    public int compare(YourClass one, YourClass two) {
        // compare using whichever properties of ListType you need
    }
});

如果您愿意,可以将这些内容构建到您的课程中:

class YourClass {

    static Comparator<YourClass> getAttribute1Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 1
        };
    }

    static Comparator<YourClass> getAttribute2Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 2
        };
    }
}

可以像这样使用:

Collections.sort(yourList, YourClass.getAttribute2Comparator());

答案 1 :(得分:3)

您班上只能使用一种compareTo()方法。

如果您想以多种方式对同一个类进行排序,请创建Comparator个实现。

答案 2 :(得分:3)

如果这两种方法需要完全相同的占用空间,则可能会不恰当地重载具有多种用途的单个类,这可以通过修复类层次结构来解决 - 而不是使用“形状”,将其子类化为“椭圆形”, “矩形”等。

如果子类化没有意义,则需要创建不同的比较类。在Java中,您经常使用Comparator进行比较。创建几个(或创建一个可配置的比较器):IsbnComparator,AuthorComparator等

哦,可配置的选项是:

 BookComparator implements Compartor {
   enum FIELD { AUTHOR, ISBN, ... };
   setSortOrder(int rank, FIELD field){...}
 }