ArrayList上的多个排序条件

时间:2013-11-01 21:11:56

标签: java sorting

我被赋予了创建具有所有常用功能的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

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

如:         Collections.sort(myTracks); myTracks是MP3_Tracks的集合,目前mt MP3_Track会覆盖compareTo()方法但是你可以看到它只按artistName对它进行排序!我希望用户可以选择如何对音轨进行排序等等。我想也许我可以在MP3_Track中有一个数据库,它可以标记要实现的类型,然后在compareTo方法中返回所需的结果。这个解决方案看起来有点麻烦,我想到的另一种可能是实现自定义界面!!!

对于光滑的解决方法的任何建议都非常感谢???

非常感谢我的进步,伟大的网站BTW ..

3 个答案:

答案 0 :(得分:4)

您需要查看Collections.sort()方法。您可以传递Comparator接口的实现,它将使用它来进行排序。

有关示例,请参阅http://www.vogella.com/articles/JavaCollections/article.html#collectionssort

答案 1 :(得分: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 :(得分:-2)

我认为你可以为每种排序设置不同的MP3_Track子类,但这似乎比让某些数据成员检查以决定使用哪种排序更麻烦,并且使运行时排序方法之间的切换变得复杂。

老实说,我没有看到使用数据成员来决定要做哪种排序的问题。