【问题标题】:Sorting of ArrayList<Track>ArrayList<Track>的排序
【发布时间】:2016-06-13 02:03:24
【问题描述】:

我想根据艺术家的名字对 ArrayList 进行排序,我使用了比较器接口,但无法对列表进行排序。所以请帮我解决这个问题。轨道数据将从文件 Trackdump 中读取。该文件每行包含一个轨道数据,格式为 TITLE/ARTIST/RATING/BPM

代码如下:

import java.io.*;
import java.util.*;

public class MusicLibrary {

    ArrayList<Track> songList = new ArrayList<Track>();

    public static void main(String args[]) {

        new MusicLibrary().go();

    }

    public void go() {
                 System.out.println("go");
        getTracks();
        System.out.println("Before Sorting:");
        System.out.println(songList);
        Collections.sort(songList);
        System.out.println("Sorted according to Artist's name:");
        System.out.println(songList);
    }

    void getTracks() {
                  System.out.println("gt");
        File file = new File("TrackDump.txt");
        try{
        BufferedReader readr = new BufferedReader(new FileReader(file));


        String line = null;
                System.out.println(readr);
        while ((line = readr.readLine()) != null) {
            System.out.println(line);
            addSong(line);
        }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    void addSong(String lineToParse) {
        String[] tokens = lineToParse.split("/");
        Track nextSong = new Track(tokens[0], tokens[1], tokens[2], tokens[3]);
        songList.add(nextSong);
        System.out.println(songList);
    }

}


class Track implements Comparator<Track>
{
    String title;
    String artist;
    String rating;
    String bpm;
    public int compare(Track o1, Track o2) {
        return o1.getArtist().compareTo(o2.getArtist());
    }
    public Track(String a, String t, String r, String b) {
        title = t;
        artist = a;
        rating = r;
        bpm = b;
    }

    public boolean equals(Object aSong) {
        return this.equals(aSong);
    }


    public String getArtist() {
        return artist;
    }

    public String getBpm() {
        return bpm;
    }

    public String getRating() {
        return rating;
    }

    public String getTitle() {
        return title;
    }

    public String toString() {
        return title + "-" + artist;
    }
}

跟踪转储:

Title1/Artist1/8/320
Title2/Artist2/10/48
T5/A7/10/120
Title4/A7/9/240
T7/Artist5/7/320
Title6/Artist6/3/240
T9/A7/1/550
T6/Artist8/5/120
T1/Artist9/5/290
Song2/A0/5/320
Song5/A8/10/320
Song1/A2/6/290

【问题讨论】:

    标签: java list sorting arraylist collections


    【解决方案1】:

    你需要实现Comparable接口,然后才能使用Collections.sort()

    class Track implements Comparable<Track> {
    
        String title;
        String artist;
        String rating;
        String bpm;
    
        @Override
        public int compare(Track other) {
            return this.getArtist().compareTo(other.getArtist());
        }
    
        ...
    

    理论上它在实现Comparator 时也可以工作,但是您必须将Track 对象传递给Collections.sort() 以充当Comparator。但这是一种相当奇怪的方法,所以最好使用上面的解决方案。

    Collections.sort(songList, new Track(null, null, null, null));
    

    【讨论】:

      【解决方案2】:

      你必须为你的Track 类实现Comparable 类。不是Comparator。然后覆盖compareTo() 方法。它看起来像这样:

      public class Track implements Comparable<Track> {
      
         // Variables, constructor, getters, setters ...
      
         @Override
         public int compareTo(Track other) {
            return this.getArtist().compareTo(other.getArtist());
         }
      }
      

      最后用Collections.sort();排序

      【讨论】:

        猜你喜欢
        • 2011-07-20
        • 2012-10-24
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-28
        相关资源
        最近更新 更多