0

私はこのような構造を持っています:

public class Foo
{
    public int A ;
    public int B ;
    public int C ;
}

A、B、C がすべて等しいコピーが 1 つだけになるように、これらを 1 つずつコレクションに追加する必要があります。次のように、別のクラスのオブジェクトへの参照も必要です。

public class Bar
{
    public Foo A ;
    public Foo B ;
    public Foo C ;
}

一意性を確保するために機能するを使用してみTreeSet < Foo >ましたが、TreeSet から参照を取得できないため (セット内にあるかどうかのブール値のみ)、その参照を に渡すことができませんBarTreeMap < Foo , Integer >とともに を使用してみました。これは一意性を確保し、オブジェクトへの参照を取得できるように機能しますが、とArrayList < Foo >を維持するために大量の時間とメモリを浪費します。ArrayListInteger

「これFooがまだコレクションにない場合は追加します。それ以外の場合はFoo、コレクションに存在するかどうかを確認するために作成したものではなく、コレクションに既にあるものを教えてください。」と言う方法が必要です。

(私は のようなことができると思いました。それは私がTreeMap < Foo , Foo >やりたいことをしますが、それはそれほど多くはありませんが、それでも無駄に思えるので、期待してこの質問を続けます啓発。)

(そして、はい、Comparableツリーで一意性チェックを行うために実装しました。その部分は既に機能しています。)

4

4 に答える 4

1

たとえば、TreeMap<Foo, Foo>オブジェクトを使用します。putマップで新規作成する場合Fooは、キーと値の両方として指定します。これにより、すでにコレクションにあるものgetを返すために使用できます。すでにマップに存在Fooする場合は、自分で処理する必要があることに注意してください。Foo

于 2012-11-10T20:44:28.253 に答える
0

どうやら aTreeListは a に基づいているTreeMapため、このアプローチは冗長になりますが、完全を期すためにとにかくコメントするだけだと思いました。

FooオブジェクトのコピーがTreeList( によって返されるなど) に存在する場合、およびメソッドcontainsを使用してコピーを取得できます。tailSetfirst

于 2012-11-11T00:35:43.210 に答える
0

a の一意性を確保するには、 andをオーバーライドして、同じ A、B、C を持つ Foo の 2 つのインスタンスが になるようSetにする必要があります。equals()hashcode().equals()

理想的には、セットに入れるものはすべて不変でなければなりません (つまり、3 つの int はfinal.ドキュメントから:

変更可能なオブジェクトをセット要素として使用する場合は、細心の注意を払う必要があります。オブジェクトがセット内の要素であるときに、オブジェクトの値が equals 比較に影響を与える方法で変更された場合、セットの動作は指定されません。

残念ながら、Set実際のインスタンスを取得できるメソッドは提供されていませんMap。すでに試したように、または別のコレクションが必要です。

別のアプローチを更新するには、JDKソース コードに基づいて独自の修正バージョンの TreeSet を作成し、必要なインスタンスを取得するメソッドを追加します (標準の TreeSet を拡張しても、関連するフィールドがprivateであるため、必要なことは実行されません。それらにアクセスするためのリフレクション)。

于 2012-11-10T20:43:24.317 に答える
0

Neil Coffey によるJava の Sorted collectionのソリューションは、私が必要とするものを提供しました。これは、既にリストにある要素のインデックス、または要素をリストに挿入する必要があるポイントのいずれかを取得するために使用しArrayList < Foo >、常に実行しています。Collections . binarySearch

これにより、ツリーのように O(log n) 時間で常にソートされたリストが維持されますが、同時に既存のインスタンスを取得できます。残念ながら、挿入時間は O(n) ですが、この場合はまだ最適ではありませんが、それで終わりではありません。

于 2012-11-10T20:53:07.347 に答える