1

私は次のことを達成したいと思っています。重複排除して並べ替えたい日付のコレクションをリスト形式で持っています。私はcollections.sortを使用してリストを日付の昇順で並べ替えてから、treeSetを使用してリストから要素をコピーして重複排除しています。これは2ショットのアプローチですか?より高速な1ステップのアプローチはありますか?

EDIT:: 

Metadata
{
 String name;
 Date sourceDate;
}

基本的に、sourceDateに基づいてメタデータオブジェクトを並べ替え、重複排除も行います。

4

2 に答える 2

4

Collections#sort手順をスキップできTreeSetます。重複を削除してエントリを並べ替えます。つまり、基本的には1行の操作です。

Set<Date> sortedWithoutDupes = new TreeSet<Date> (yourList);

日付がオブジェクトのフィールドである場合、次のいずれかを実行できます。

  • オブジェクトにComparableを実装させ、日付に基づいてオブジェクトを比較します
  • またはComparator<YourObject>、オブジェクトを日付で並べ替えるTreeSetコンストラクターに引数としてaを渡します。

どちらの場合も、リストを事前に並べ替える必要はありません。

重要な注意点:

TreeSetはcompareToキーを比較するために使用します。したがって、2つのキーの日付が同じで名前が異なる場合は、compareまたはcompareToメソッドが0以外の値を返すことを確認する必要があります。そうでない場合、2つのオブジェクトは等しいと見なされ、1つだけが挿入されます。

編集

コードは次のようになります(テストされていません+ nullを処理する必要があります):

Comparator<Metadata> comparator = new Comparator<Metadata>() {
    @Override
    public int compare(Metadata o1, Metadata o2) {
        if (o1.sourceDate.equals(o2.sourceDate)) {
            return o1.name.compareTo(o2.name);
        } else {
            return o1.sourceDate.compareTo(o2.sourceDate);
        }
    }
};

Set<Metadata> sortedWithoutDupes = new TreeSet<Metadata> (comparator);
sortedWithoutDupes.addAll(yourList);
于 2013-01-23T23:38:42.440 に答える
0

TreeSetはその要素を自動的に並べ替えるので、セットに追加する前にリストを並べ替える必要はありません。

于 2013-01-23T23:38:54.070 に答える