Java Comparator使用.reverseOrder()但内部类

Jam*_*son 27 java sorting comparable

我正在创建一个简单的程序来了解Java Comparator类.我已按Arraylist顺序排序,但现在我想按降序对列表进行排序,但是在调用.reverseOrder()方法时遇到问题,因为我使用了一个实现的内部类Comparator<Song>(歌曲是一个包含getter和setter方法的歌曲类).

这是我的SongSort班级,其中包括分拣过程等.

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

public class SongSort
{
    ArrayList<Song> songList = new ArrayList<Song>();

    public void main(String[] args)
    {
        new SongSort().go();
    }

    class ArtistCompare implements Comparator<Song>
    {
        public int compare(Song one, Song two)
        {
            return one.getRating().compareTo(two.getRating());
        }
    }


    public void go()
    {

        getSongs();
        System.out.println(songList);
        //Collections.sort(songList); 
        System.out.println(songList);

        ArtistCompare artistCompare = new ArtistCompare();
        Collections.sort(songList, artistCompare);
        System.out.println(songList);
    }



    public void getSongs()
    {
        try{
            File file = new File("SongListMore.txt");
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line = null;

            while((line = reader.readLine()) != null)
               {
                   addSong(line);
               }
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }

        public void addSong(String lineToParse)
        {
            String [] tokens = lineToParse.split("/");
            Song nextSong = new Song(tokens[0],  tokens[1], tokens[2], tokens[3]);
            songList.add(nextSong);

    }

}
Run Code Online (Sandbox Code Playgroud)

这是我的简单Song课程;

public class Song //implements Comparable<Song>
{
    private String title;
    private String artist;
    private String rating;
    private String bpm;

    public Song(String t, String a, String r, String b)
    {
        title = t;
        artist = a;
        rating = r;
        bpm = b;
    }

    public String getTitle()
    {
        return title;
    }

    public String getArtist()
    {
        return artist;
    }
    public String getRating()
    {
        return rating;
    }
    public String getBpm()
    {
        return bpm;
    }

    public String toString()
    {
       return ("Title : " + title + "," +  " Artist : " + artist +  " Rating : " + rating);
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我弄清楚我将reverseOrder()SongSort类中调用该方法,因为它不会编译?

Puc*_*uce 79

ArtistCompare artistCompare = new ArtistCompare();
Collections.sort(songList, Collections.reverseOrder(artistCompare));
Run Code Online (Sandbox Code Playgroud)

编辑2015年7月

由于这个答案仍然受到一些关注,这里有一个小小的更新:

使用Java SE 8,创建反向比较器变得更加容易:

Comparator<Song> songRatingComparator = Comparator.comparing(Song::getRating);
Collections.sort(songList, songRatingComparator.reversed());
Run Code Online (Sandbox Code Playgroud)

当然,您也可以使用Streams框架:

List<Song> sortedSongList = songList.stream()
.sorted(Comparator.comparing(Song::getRating).reversed())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


Ral*_*lph 5

实现逆序比较器的一种方法是实现Compartor-Delegate(比较器结果反转)(通过更改顺序)。

public class ReverseOrder<T> implements Comparator<T> {
  private Comparator<T> delegate;
  public ReverseOrder(Comparator<T> delegate){
    this.delegate = delegate;
  }

  public int compare(T a, T b) {
    //reverse order of a and b!!!
    return this.delegate.compare(b,a);
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,您唯一需要做的就是使用此委托。例如:

  Comparator myComparator = new myComparator();
  List list = ...;
  List reverse = new ArrayList(list);

  //acceding
  Collections.sort(list, myComparator);

  //descending
  Collections.sort(list, new ReverseOrder(myComparator));
Run Code Online (Sandbox Code Playgroud)

  • java.utils.Collections.reverseOrder(Comparator c)将执行相同操作,并反转比较器的比较。因此,您不应该在这里重新发明轮子,而应使用Java SE API。 (2认同)
  • 这就是为什么Puce的答案是公认的答案。-无论如何,我不会删除此答案,因为它是有效的答案。 (2认同)