27

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

甚至可能吗?

4

3 回答 3

66

你需要做的是实现一个自定义的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());
于 2010-12-13T19:42:19.523 回答
3

您的班级中只能有一种compareTo()方法。

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

于 2010-12-13T19:41:35.793 回答
3

如果这两种方法需要完全相同的占用空间,您可能会不恰当地重载具有多种用途的单个类,这可以通过修复您的类层次结构来解决 - 就像不使用“shape”,而是使用“oval”、“rectangle”对其进行子类化, ETC。

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

哦,可配置的选项是:

BookComparator 实现 Compartor {
   枚举字段{作者,ISBN,...};
   setSortOrder(int rank, FIELD field){...}
 }
于 2010-12-13T19:45:18.897 回答