2

我正在使用几个比较器将对象的 ArrayList 排序为降序或升序。目前,这些比较器属于不同的类别。如何将以下比较器组合成一个类?

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);
    }
}
4

4 回答 4

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);
}
于 2013-06-01T10:28:38.647 回答
0

我相信编写一个比较器工厂可能是一个好主意。尝试查看此示例或尝试 google 了解更多信息:

http://some-technical-stuff.blogspot.in/

于 2013-06-01T08:29:58.147 回答
0

您可以将电影保存在 a TreeSet(或 a TreeMap)而不是 a 中List,并且它们在插入时排序(您将Comparatoras 参数提供给构造函数)。要获得反转的电影,只需调用Collections.reverse()

于 2013-06-01T08:34:47.743 回答
0

你可以使用方法Comparator<T> Collections.reverseOrder(Comparator<T>)

另外我建议不要Comparator每次都创建新的,而是分配一次然后存储它们。

如果您需要更复杂的比较器,Guava 的 Ordering 类可能会很有用:Ordering Explained

于 2013-06-01T08:39:14.293 回答