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

时间:2010-11-23 23:17:46

标签: java comparison

说我有一个像

这样的Song对象
public Song(){
  String artist, title;
  StringBuilder lyrics;
  int rank;
}

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

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

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

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

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

5 个答案:

答案 0 :(得分:10)

使用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

答案 1 :(得分:4)

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

答案 2 :(得分:4)

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

Set<Song> allSongs = new TreeSet<Song>(Song.BY_TITLE);
PriorityQueue<Song> rankedSongs = new PriorityQueue<Song>(10, Song.BY_RANK);

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

答案 3 :(得分:2)

您可以使用构造函数PriorityQueue(int, Comparator<? super E>)来使用不同的顺序。

除了排序之外,是否有理由使用PriorityQueuePriorityQueue不仅效率低下,如果您不需要在每个新元素之后对其进行排序,也不能用于以不同方式进行排序。对于每个所需的排序,您需要不同的PriorityQueue

使用List就足够了,您可以随时使用其他Comparator进行排序:Collections.sort(List<T> list, Comparator<? super T>)

答案 4 :(得分:1)

不要在歌曲中实现Comparable,而是将自定义Comparator传递给您选择的Collection。

有关详细信息,请参阅Object Ordering