ソートされたセットに配置したいタイムスタンプ付きの値のセットがあります。
public class TimedValue {
public Date time;
public double value;
public TimedValue(Date time, double value) {
this.time = time;
this.value = value;
}
}
このセットをソートするためのビジネスロジックでは、最新の値より7日以上古い場合を除き、値は値の降順で並べ替える必要があります。
そこで、テストとして、次のコードを思いつきました...
DateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy");
TreeSet<TimedValue> mySet = new TreeSet<TimedValue>(new DateAwareComparator());
mySet.add(new TimedValue(dateFormatter.parse("01/01/2009"), 4.0 )); // too old
mySet.add(new TimedValue(dateFormatter.parse("01/03/2009"), 3.0)); // Most relevant
mySet.add(new TimedValue(dateFormatter.parse("01/09/2009"), 2.0));
ご覧のとおり、最初は最初の値の方が2番目の値よりも関連性がありますが、最終的な値がセットに追加されると、最初の値の有効期限が切れ、関連性が最も低くなります。
私の最初のテストでは、これは機能するはずだと言っています...さらに値が追加されると、TreeSetはリスト全体を動的に並べ替えます。
でも、見ても信じられない。
並べ替えられたコレクションは、各要素が追加されるときにセット全体を並べ替えますか?ソートされたコレクションをこの方法(つまりパフォーマンス)で使用するための落とし穴はありますか?すべての値が追加された後、リストを手動で並べ替えた方がよいでしょうか(おそらくそうなると思います)。
フォローアップ:
多くの(そしてある程度は私でさえ)疑われるように、ソートされたコレクションはこの方法の「動的な並べ替え」をサポートしていません。私の最初のテストは、まったく偶然に「機能」していたと思います。セットに要素を追加すると、「順序」が急速に崩壊しました。すべての素晴らしい回答に感謝し、多くの人から提案されたアプローチを使用するようにコードをリファクタリングしました。