ArrayList上的多个排序标准

3

我被分配了一个任务,需要创建一个带有所有常规功能的MP3目录。我有MP3_Track、MP3_UserInterface和Main类。

public class MP3_Track implements Comparable<MP3_Track>{

private int trackNo;
private String artistName;
private String albumName;
private String trackLength;

MP3_Track(int no, String artist, String album, String length){
    this.trackNo = no;
    this.artistName = artist;
    this.albumName = album;
    this.trackLength = length;

// setters & getters

@Override
public String toString(){
        return (" Track Number : " + trackNo + "\n Artist Name  : " + artistName + "\n Album Name   : " + albumName +"\n Track Length : " + trackLength);
}

@Override
public int compareTo(MP3_Track aTrack){
    int result;
    try{
        result = artistName.compareTo(aTrack.artistName);
    }
    catch(UnsupportedOperationException e){
        throw new UnsupportedOperationException("Not supported here.");
    }
    return result;
  }
}

我的主类包含:

static void deleteTrack()
static MP3_Track addTrack()
static void moveTrack()
static void exploreTracks()...etc

根据用户在控制台输入的内容,Main调用相关方法。

例如: Collections.sort(myTracks); myTracks是MP3_Tracks的集合,目前mt MP3_Track覆盖了compareTo()方法,但是你可以看到它只按artistName排序!!!我希望用户可以选择如何排序曲目等。我想也许我可以在MP3_Track中有一个数据成员来标记要实现的排序类型,然后在compareTo方法中进行一些if语句以返回所需结果。这种解决方案似乎有些繁琐,我想到的另一种可能性是实现自定义接口!!!

有什么关于巧妙解决的建议吗?非常感谢您的帮助,顺便说一下,这个网站很棒。


虽然您可能认为在标识符中加入下划线会使它们更易于阅读,但在Java中这样做是被强烈反对的。它们实际上只用于其他语言(如C和SQL)中的标识符。 - Robin Green
为什么不直接使用比较器? - Amir Afghani
嗨,Scott,感谢您的回复。那么解决方案就是在调用sort()之前编辑datamember?那么我猜我需要遍历我的MP3目录并标记每个曲目的这个成员? - TripVoltage
3个回答

4

3
您可以根据用户输入向 Collections.sort 传递自定义比较器。
例如 --
if ( "artistName".equals(sortType) ) {
    Collections.sort(myList, new Comparator<MP3_Track>() {
        @Override
        public int compare(MP3_Track track1, MP3_Track track2) {
          // use artist name to compare
        }
    });
 }
 else if ("albumName".equals(sortType) {
   ...
 }

-2

我想你可以为每种排序方式创建不同的MP3_Track子类,但是这似乎比拥有一些数据成员来检查以决定使用哪种排序方式更加麻烦,并且会使在运行时切换排序方法变得复杂。

老实说,我不明白使用数据成员来决定进行哪种排序有什么问题。


非常感谢您的回复。这是我的第一个想法,但我只能看到以下解决方案。 - TripVoltage
3
这样做的问题在于它违反了 compareTo 的对称性条件。不要这样做。 - Robin Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接