将隔间组合成一个类

时间:2013-06-01 08:24:47

标签: java oop sorting arraylist comparator

我使用几个隔离专区将对象的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);
    }
}

4 个答案:

答案 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进行更多操作:

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

答案 2 :(得分:0)

您可以将电影保存在TreeSet(或TreeMap)而不是List,并在插入时对其进行排序(您将Comparator作为参数进行排序到构造函数)。要获得反转的电影,只需拨打Collections.reverse()

即可

答案 3 :(得分:0)

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

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

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