假设我有一个Song对象,比如
public Song(){
String artist, title;
StringBuilder lyrics;
int rank;
}
有没有可能有多个比较方法,根据使用的集合,按特定字段排序?这个对象已经有了一个基于艺术家和标题值进行排序的比较方法,我希望能够基于排名进行排序。
我目前的项目要求我们对歌曲的歌词进行搜索,并返回一个从高到低的匹配列表。我想使用一个PriorityQueue来保存基于排名值的匹配。
通常我会简单地创建另一个对象来保存歌曲和排名,但这个项目不仅插入到教授提供的图形用户界面中,这需要在Song[]数组中传递任何结果,而且打印出排名、艺术家、标题的前十个值。
我可以使用toArray()来转换队列,但是如果我使用它来存储除Song对象之外的任何对象,它将抛出一个ArrayStoreException。
那么,这是可能的吗,或者我必须修改现有的compare方法来按整数值排序?
发布于 2010-11-23 23:28:26
大多数有序集合都有一个以Comparator
作为参数的构造函数。在Song
类中定义几个静态比较器,然后按如下方式定义:
Set<Song> allSongs = new TreeSet<Song>(Song.BY_TITLE);
PriorityQueue<Song> rankedSongs = new PriorityQueue<Song>(10, Song.BY_RANK);
有一些实用程序类(例如,Guava Ordering)可以帮助您从基础知识构建其他比较器。
发布于 2010-11-23 23:25:09
使用Comparator。
Comparator<Song> rankOrder = new Comparator<Song>() {
public int compare(Song s1, Song e2) {
return s1.rank - s2.rank;
}
};
Collections.sort(songs, rankOrder);
请参阅http://download.oracle.com/javase/tutorial/collections/interfaces/order.html
发布于 2010-11-23 23:22:06
Comparable
接口的compareTo
方法通常提供默认比较,如果您想提供另一个比较,则应该编写一个Comparator
对象。
https://stackoverflow.com/questions/4262029
复制