ArrayList <Track>的排序 - java

我想根据艺术家的名字对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

参考方案

您需要实现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));

无法从ArrayList <String>转换为List <Comparable> - java

当我写下面的代码时,编译器说 无法从ArrayList<String>转换为List<Comparable>private List<Comparable> get(){ return new ArrayList<String>(); } 但是当我用通配符编写返回类型时,代码会编译。private List&l…

合并List <T>和List <Optional <T >> - java

鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…

实例化类型<?>的泛型类 - java

我正在为SCJP / OCPJP学习,并且遇到了一个对我来说很奇怪的示例问题。该示例代码实例化了两个通用集合:List<?> list = new ArrayList<?>(); List<? extends Object> list2 = new ArrayList<? extends Object>(); …

在HashMap <String,String>上循环时出现问题 - java

我有一个基本的HashMap。我正在尝试遍历它,并从Map中获取键和值。这是我所拥有的:Map<String, String> myMap = versionExtractor.getVersionInfo(); for(String key : myMap.keySet()) System.out.println(key); System.ou…

OpenShift构建错误:无法在多模块Maven Spring启动项目的父模块中导入子模块类 - java

我有一个使用spring的多模块Maven项目。通用模块类用作业务模块项目中的直接导入。我可以在本地PC上编译并成功运行它们。当我在OpenShift中部署相同的模块时,出现错误,无法在业务模块中导入通用模块类。项目结构可以总结如下:项目根 通用模块 src pom.xml 业务模块 src pom.xml pom.xml父POM:<?xml vers…