7

hashCode()セット エントリはプロパティのサブセット ( + )によってのみ区別されるためequals()、セットに含まれる元のオブジェクトを操作する必要がある場合がありますが、これは では不可能java.util.Setです。私が思いついた唯一の代替案は次のとおりですMap<T, T>。-非常に簡潔な解決策ではありません。

コレクションフレームワークに他の選択肢はありますか? 要件は次のとおりです: O(1) フェッチ時間と、結果に基づく重複なしhashCode() + equals()

4

7 に答える 7

2

もう 1 つの O(1) 操作が問題にならない場合は、メソッドとのペアを使用して欠落メソッドをシミュレートできます。そうでなければ、あなたが言及したように、または基礎となるマップを持つ単純なラッパークラスを使用します。get(Object)set.remove(Object)set.add(Object)Map<T,T>

EDITSet :含まれていない理由はget(Object)、知っているオブジェクトを返す必要がないためです。オブジェクトがセットに含まれているかどうかを確認するだけです。

于 2015-01-04T16:33:44.687 に答える
0

ASetに 2 つのオブジェクトなどを含めることはできませo1o2) (この基準ではo1.equals(o2Noが使用されます)。hashCode

AHashSetは hashmap を使用してそのオブジェクトを効率的に格納するため、最終的には HashMap がベースの操作に必要なものになりますhashCode()+equals()

于 2013-07-11T13:19:54.237 に答える
0

それjava.util.Collections自体ではなく、Google GuavaIteratorを使用すると、特定のusingから任意の要素を取得できますIterables.get

通常、私は外部ライブラリを推奨しませんが、Guava が非常に強力で便利であることを考えると、問題はないと思います。

または、独自の実装でセットを反復することもできます。


さらに、この動作を説明する非常に興味深いスレッドを見つけました。

于 2013-07-11T13:13:52.620 に答える
0

I wrote such a class if you want to reuse it. Jayes contains a class org.eclipse.recommenders.jayes.util.sharing.CanonicalSet that allows retrieval based on pretty much any equivalence relation that you can encode in a hashCode() and equals() implementation. I used it to build array equivalence classes. You can look at those implementations of CanonicalSet, they are in the same package.

Oh, but yeah, it's also just based on a Map<Entry<T>,T>, so nothing magical really.

于 2013-07-11T13:27:56.083 に答える