2010-11-23 4 views
4

オブジェクトは異なる値に基づいて順序付けを行う複数の比較メソッドを持つことができますか?

public Song(){ 
    String artist, title; 
    StringBuilder lyrics; 
    int rank; 
} 

のような歌のオブジェクトは、それは一種の特定のフィールドで、複数のコレクションに応じて使用、方法を比較することは可能です私が持っていると言いますか?このオブジェクトには、アーティスト名とタイトル値に基づいたオーダーの比較メソッドが既に用意されており、ランクに基づいて注文することができます。

私の現在のプロジェクトでは、ソングの歌詞の検索を実行し、高いものから低いものへの一致リストを返す必要があります。 PriorityQueueを使用してランク値に基づいて一致を保持したい。

通常、ソングとランクを保持する別のオブジェクトを作成するだけですが、このプロジェクトは教授が提供するGUIインターフェイスにプラグインするだけでなく、結果をSong []配列に渡す必要がありますが、最初の10の値はRank、Artist、Titleとなります。

toArray()を使用してキューを変換できますが、Songオブジェクト以外のものを格納するために使用すると、ArrayStoreExceptionがスローされます。

これは可能ですか、または既存の比較方法を変更して整数値でソートする必要がありますか?

答えて

4

ほとんどの順序付けられたコレクションには、Comparatorを引数として持つコンストラクターがあります。あなたのSongクラスにいくつかの静的なコンパレータを定義してから、次のようなものを定義します。

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

あなたは基礎から他のコンパレータを構築することができますユーティリティクラス(例えば、グアバOrdering)があります。

4

ComparableインターフェイスのcompareToメソッドは通常、デフォルトの比較を提供します。別のものを提供する場合は、Comparatorオブジェクトを記述する必要があります。

1

を参照してください。

詳細はObject Orderingを参照してください。

+0

これは私がやったことでは、(Oで行われている優先度つきキューに項目を挿入する魅力 – Jason

2

コンストラクタPriorityQueue(int, Comparator<? super E>)を使用すると、異なる順序を使用できます。

PriorityQueueをソートして使用する理由はありますか? PriorityQueueは、新しい要素ごとにソートする必要はないだけでなく、さまざまな方法でソートすることもできない場合は非効率的であるだけでなく、それぞれのソートにはそれぞれ異なるPriorityQueueが必要です。十分な可能性があり、あなたが好きなときにいつでも別のComparatorを使用して並べ替えることが可能になるListを使用して

Collections.sort(List<T> list, Comparator<? super T>)

+1

のように動作しますログN)時間。 Javaは、O(N log N)ランタイムを持つ変更されたマージソートを使用します。私がArraylistを挿入するように命じたとしても、時間を追加するとO(N)になります。私はそれを得ることができるときに何かのログ時間を取るよ。 – Jason

関連する問題