我有一个歌曲的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;
}
答案 0 :(得分:9)
Collections.reverse
没有排序。它只是颠倒了列表元素的顺序。因此,如果列表包含T, F, Z
,则它将包含Z, F, T
。
您的代码片段初始化比较器,但不对其执行任何操作。正如the javadoc所说,如果集合的元素实现了Comparable
接口,那么这个比较器才有效。
您应该使Song
类实现Comparable
接口(查看其javadoc以了解此接口必须执行的操作),或者您必须使用特定的Comparator
实现。无论选择何种解决方案,您都必须实现一些代码来告诉Collections.sort
歌曲之间的比较情况。当它的标题出现在另一首歌的标题之前时,是否还有另一首歌?或者它的持续时间是否比另一个短?