Collection.sort /反向/ reverOrder

时间:2011-08-28 10:22:31

标签: java algorithm sorting collections

我有一个歌曲的Arraylist存储标题,艺术家和时间 我写了所有代码和一切。我只是想了解更多关于Collection.sort和Collection.reverse以及Collection.reverseOrder的信息。我有一个包含所有歌曲和所有内容的文件。 我想根据时间按降序排序歌曲。

当我尝试这个时,我得到一个错误或它没有正确排序。任何人都可以建议我 不能使用Collection.sort并使用比较器

Comparator<Song> comparator = Collections.reverseOrder();
Collections.reverse(listOfSongs);

我的比较方法如下:

public int compare(Song mySong1,Song mySong2 ){
        if (mySong1.getLength() > mySong2.getLength()){
            return -1; 
        }
        if(mySong1.getLength() < mySong2.getLength()){
            return 1;
        }
        if(mySong1.getLength() == mySong2.getLength())
        {
            if(mySong1.getTitle().compareTo(mySong2.getTitle()) > 0){
                return -1;
            }
            if(mySong1.getTitle().compareTo(mySong2.getTitle())  < 0 ){
                return 1;
            }
            else {
                if(mySong1.getComposer().compareTo(mySong2.getComposer())  >0){
                    return -1;
                }
                if(mySong1.getComposer().compareTo(mySong2.getComposer())  <0) {
                    return 1;
                }
            }
        }
        return 0; 
    }

1 个答案:

答案 0 :(得分:9)

Collections.reverse没有排序。它只是颠倒了列表元素的顺序。因此,如果列表包含T, F, Z,则它将包含Z, F, T

您的代码片段初始化比较器,但不对其执行任何操作。正如the javadoc所说,如果集合的元素实现了Comparable接口,那么这个比较器才有效。

您应该使Song类实现Comparable接口(查看其javadoc以了解此接口必须执行的操作),或者您必须使用特定的Comparator实现。无论选择何种解决方案,您都必须实现一些代码来告诉Collections.sort歌曲之间的比较情况。当它的标题出现在另一首歌的标题之前时,是否还有另一首歌?或者它的持续时间是否比另一个短?

请参阅Sorting an ArrayList of Contacts based on name?