我使用几个隔离专区将对象的ArrayList按降序或升序排序。 Currenlty,这些比较器属于不同的类别。如何将以下比较器组合成一个类?
class ascendingSortComparator implements Comparator<Movie> { //sort movie ascending
@Override
public int compare(Movie movie1, Movie movie2) {
return movie1.getTitle().compareTo(movie2.getTitle());
}
}
class descendingSortComparator implements Comparator<Movie> { //sort movie ascending
@Override
public int compare(Movie movie1, Movie movie2) {
return -movie1.getTitle().compareTo(movie2.getTitle());
}
}
如果可能,我该如何调用适当的比较器。目前我称之为:
public void sortData() {
String option = (String) sortComboBox.getSelectedItem();
if ("Ascending".equals(option)) {
Collections.sort(movieCatalog, new ascendingSortComparator());
//indexCount = (movieCatalog.size()-1) - indexCount;
//displayData(indexCount);
}
if ("Descending".equals(option)) {
Collections.sort(movieCatalog, new descendingSortComparator());
//indexCount = (movieCatalog.size()-1) - indexCount;
//displayData(indexCount);
}
}
答案 0 :(得分:3)
我会使用枚举
public enum MovieComparator implement Comparator<Movie> {
ASCENDING { //sort movie ascending
public int compare(Movie movie1, Movie movie2) {
return movie1.getTitle().compareTo(movie2.getTitle());
}
}, DECENDING {
public int compare(Movie movie1, Movie movie2) {
return movie2.getTitle().compareTo(movie1.getTitle());
}
}
}
public void sortData() {
String option = (String) sortComboBox.getSelectedItem();
MovieComparator cmp = MovieComparator.valueOf(option.toUpperCase());
Collections.sort(movieCatalog, cmp);
}
答案 1 :(得分:0)
我相信编写比较器工厂可能是一个好主意。尝试查看此示例或尝试使用Google进行更多操作:
答案 2 :(得分:0)
您可以将电影保存在TreeSet
(或TreeMap
)而不是List
,并在插入时对其进行排序(您将Comparator
作为参数进行排序到构造函数)。要获得反转的电影,只需拨打Collections.reverse()
答案 3 :(得分:0)
您可以使用方法Comparator<T> Collections.reverseOrder(Comparator<T>)
。
另外,我建议不要每次都创建新的Comparator
,而是分配它们一次然后存储它们。
如果您需要更复杂的比较器,Guava的类订购可能很有用:Ordering explained。