对象是否可以根据不同的值进行多种比较方法的排序?

Jas*_*son 5 java comparison

说我有一个像宋的对象

public Song(){
  String artist, title;
  StringBuilder lyrics;
  int rank;
}
Run Code Online (Sandbox Code Playgroud)

是否有可能有多种比较方法,根据使用的集合,按特定字段排序?此对象已经有一个基于艺术家和标题值的排序比较方法,我希望能够根据排名进行排序.

我当前的项目要求我们对歌曲的歌词进行搜索并返回从高到低的匹配列表.我想使用PriorityQueue根据排名值保存匹配项.

通常我会创建另一个对象来保存歌曲和等级,但这个项目不仅插入教授提供的GUI界面,这需要在Song []数组中传递任何结果,但打印出前十个值作为排名,艺术家,标题.

我可以使用toArray()来转换队列,但是如果我使用它来存储除Song对象之外的任何东西,它将抛出一个ArrayStoreException.

这是可能的,还是我必须修改现有的比较方法以按整数值排序?

Ada*_*dam 11

使用比较器.

Comparator<Song> rankOrder =  new Comparator<Song>() {
        public int compare(Song s1, Song e2) {
            return s1.rank - s2.rank;
        }
    };
Collections.sort(songs, rankOrder);
Run Code Online (Sandbox Code Playgroud)

请参阅http://download.oracle.com/javase/tutorial/collections/interfaces/order.html


Ree*_*ore 5

接口的compareTo方法Comparable通常提供默认的比较,如果你想提供另一个你应该写一个Comparator对象。


Mic*_*vis 5

大多数有序集合都有一个以 aComparator作为参数的构造函数。在类中定义一些静态比较器Song,然后定义如下:

Set<Song> allSongs = new TreeSet<Song>(Song.BY_TITLE);
PriorityQueue<Song> rankedSongs = new PriorityQueue<Song>(10, Song.BY_RANK);
Run Code Online (Sandbox Code Playgroud)

有一些实用程序类(例如 Guava Ordering)可以帮助您从基础知识构建其他比较器。