我有一个类,我已经按一个属性对其进行了排序。现在我需要做另一件事,我需要创建另一种方式来对我的数据进行排序。我怎样才能做到,所以我可以在两种方法之间进行选择。我知道的唯一命令是 Collections.sort,它将从我想要比较其数据的类中选择方法 compareTo。
甚至可能吗?
我有一个类,我已经按一个属性对其进行了排序。现在我需要做另一件事,我需要创建另一种方式来对我的数据进行排序。我怎样才能做到,所以我可以在两种方法之间进行选择。我知道的唯一命令是 Collections.sort,它将从我想要比较其数据的类中选择方法 compareTo。
甚至可能吗?
你需要做的是实现一个自定义的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());
您的班级中只能有一种compareTo()
方法。
如果您想以不止一种方式对同一个类进行排序,请创建Comparator
实现。
如果这两种方法需要完全相同的占用空间,您可能会不恰当地重载具有多种用途的单个类,这可以通过修复您的类层次结构来解决 - 就像不使用“shape”,而是使用“oval”、“rectangle”对其进行子类化, ETC。
如果子类化没有意义,您需要创建不同的比较类。在 Java 中,您经常使用 Comparator 进行比较。创建几个(或创建一个可配置的比较器):IsbnComparator、AuthorComparator 等。
哦,可配置的选项是:
BookComparator 实现 Compartor { 枚举字段{作者,ISBN,...}; setSortOrder(int rank, FIELD field){...} }