2016-02-29 76 views
2

我想根據藝術家的名字對ArrayList進行排序我已經使用了比較器接口,但是我無法對列表進行排序。所以請幫助我解決問題。軌道數據將從文件Trackdump.The文件中讀取將包含在格式TITLE/ARTIST/RATING/BPMArrayList的排序<Track>

在這裏,每行一個軌道的數據是代碼:

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; 
    } 
} 

Trackdump:

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 

回答

2

您需要實現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)); 
4

您必須實現Comparable類的Track類。不是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();

排序