NavigableSet
インターフェイスは、法線Set
にはない多くの便利なメソッドを提供します (具体的には、たとえば や のようなメソッドについて考えていheadSet
ますtailSet
)。ただし、 であるためSet
、重複する要素はサポートされません。また、 であるためSortedSet
、順序付けは一貫性がequals
ありhashCode
、インターフェースの規約に違反しないようにする必要がありSet
ます。
自然な順序付けまたは Comparator に従って「等しい」がメソッドによれば「等しい」ではない、重複する要素または複数の要素が存在する可能性がある場合に適した代替データ構造はありますequals
か? NavigableSet
動機付けとなる例として、aが適切でない理由を示す次のコードを考えてみましょう。
public class Foo implements Comparable<Foo>{
double x;
double y;
@Override
public int compareTo(Foo o) {
return Double.compare(x, o.x); // only x matters for sort order
}
public static void main(String...args){
Foo a = new Foo();
a.x = 1;
a.y = 2;
Foo b = new Foo();
b.x = 1;
b.y = 42;
Foo c = new Foo();
c.x = 2;
c.y = 12.34;
NavigableSet<Foo> set = new TreeSet<Foo>();
set.add(a);
set.add(a);
set.add(b);
set.add(c);
System.out.println(set.size());
}
}
要素は 1 回だけ追加されることに注意してくださいa
(もちろん、これは であるためSet
)。また、b
比較が 0 を返す要素が既に存在するため、 が追加されないことに注意してください。
これはおそらくかなり一般的なことだと感じたので、独自の実装を作成するのではなく、既存の実装を見つけたいと考えました。私の目的に適した、広く使用されているデータ構造はありますか?
この質問を書いているときにBiscotti Projectに出くわしたことを付け加えておきますが、a) それが比較/等号の問題を解決するとは確信していません。