【发布时间】:2021-01-06 10:21:12
【问题描述】:
所以,我现在正在与几个人一起为学校做一个项目,其中一个人提交了一些我真的很难理解的代码。该项目的基础是创建一个包含歌曲、专辑和播放列表的音乐库。这些播放列表尤其是arraylists 的歌曲需要不同的排序方式,因此他实现了排序比较器。他使用枚举来做到这一点,我只是从实例的角度来理解它来表示项目。喜欢
public enum Suit {
SPADES, CLUBS, HEARTS, DIAMONDS
}
代表一张牌的不同花色。我还了解到您可以在枚举旁边声明方法,这就是他所做的。这里是属性声明区和构造函数:
public class Playlist implements Comparator<Song>{
private TotalTime aTotalTime;
private String aName;
private ArrayList<Song> playList;
private Comparator<Song> aComparator;
private enum Method{
SortByTitle(new Comparator<Song> () {
@Override
public int compare(Song o1, Song o2) {
// TODO Auto-generated method stub
return o2.getTitle().compareTo(o1.getTitle());
}
}),
SortByArtist(new Comparator<Song>() {
@Override
public int compare(Song o1, Song o2) {
// TODO Auto-generated method stub
return o2.getExpectedTags().getArtist().compareTo(o1.getExpectedTags().getArtist());
}
}),
SortByLength(new Comparator<Song>() {
@Override
public int compare(Song o1, Song o2) {
// TODO Auto-generated method stub
return o2.getTotalSeconds()-o1.getTotalSeconds();
}
});
private Comparator<Song> comparator;
Method(Comparator<Song> pComparator){
comparator = pComparator;
}
public Comparator<Song> getComparator(){
return this.comparator;
}
}
// constructor that initializes the the playlist.
public Playlist(String pName,Method aMethod) {
aName = new String(pName);
playList = new ArrayList<Song>();
this.aComparator = aMethod.getComparator();
}
}
我可以隐约知道这里发生了什么:我们从构造函数开始,它调用aMethod.getComparator(),aMethod 是枚举实例,然后aMethod.getComparator() 返回this.comparator 对象,它本身就是将上面的三行声明为private Comparator<Song> comparator。从我的角度来看,看起来 ithis 每次都会返回私有 comparator 对象,而实际上并没有改变 Comparable 接口的排序方法。任何解析所有这些的帮助将不胜感激。
【问题讨论】:
-
您还需要检查代码中实际使用
Method枚举的位置。上面的代码都是关于以更智能的方式定义多种排序策略。 :) 但是,确切的问题是什么或您没有正确理解哪一行? -
除了你的问题:(1)为什么
aName = new String(pName);而不是简单的aName = pName;?字符串是不可变的,那么这里期望什么优势? (2) 为什么class Playlistimplements Comparator<Song>??播放列表的实例是否应该像List<Song> songs = ...; songs.sort(playlistInstance)一样使用? -
@JudeNiroshan 我想这是关于如何将输入作为定义的枚举之一提供给构造函数将改变排序度量。现在看起来,传递的任何枚举都决定了如何使用
Collection.sort来比较这些值。但我在当前的实现中没有看到它实际上是如何改变comparator对象的。它似乎每次都返回相同的private Comparator<Song> comparator -
@Pshemo 1. 我不知道为什么会这样 2. 播放列表在其
arraylist属性中填充了歌曲,因此决定我们需要一种组织方式说playList。 playList 数组列表只会存在于 Playlist 对象中。 -
“我们需要一种组织播放列表的方法”,但这就是为什么你有
private Comparator<Song> aComparator;... 所以implements Comparator<Song>很可能是多余的/错误的。跨度>
标签: java enums comparator implements