我有一个类,我已经用一个属性对它进行排序。 现在我需要做另一件事,我需要创建另一种方法来对数据进行排序。 我该怎么做,所以我可以在两种方法之间做出选择。 我知道的唯一命令是Collections.sort,它将从我想要比较其数据的类中获取方法compareTo。
甚至可能吗?
答案 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){...} }