0

挿入順序を維持する以外に、LinkedHashSet を使用して一意の要素のセットを格納する既存の機能があります。

LinkedHashSet に既に存在する場合、特定の要素を取得する必要があるという新しい要件があります。つまり、要素を追加しようとすると、メソッドは要素が既に存在するかどうかを確認し、既存の要素を返す必要があります。LinkedHashSet には最大 10000 個の要素が含まれる場合があります。

これを実現する現在の方法は、LinkedHashSet で反復子を使用することです。

Class CustomObject {
    String id;
    String name;

    CustomObject (String id, String name) {
    this.id = id;
    this.name = name;
    }

    LinkedHashMap<String, LinkedHashSet<CustomObject>> parentRecord = new LinkedHashMap<String, LinkedHashSet<CustomObject>>(4);
    .
    .
    .
    public CustomObject addCustomObject (CustomObject customObject) 
    //Assume the following child node not to be null
        Set<CustomObject> child = parentRecord.get("customObjectName");

        if (child.contains(customObject)) {         
            Iterator<CustomObject> it = child.iterator();       
            while (it.hasNext()) {
               CustomObject node = it.next();           
                   if (node.getId().equals(customObject.getId())) {
                       return node;
                   } 
            }   
        }

        child.add(customObject);

        return customObject;
    }

}

効率的な代替データ構造の方法はありますか

  1. 一意の値を保存する

  2. 追加しようとしたときに特定の要素が既に存在する場合は、その要素を返します

  3. 広告掲載順を維持する(可能な場合)

追加される customObject は既にセットに含まれているため、customObject 自体を返すことは理にかなっています。ただし、ノード内にノードを構築しているため、それはうまくいきません。返される customObject には、子ノードがある場合があります。

4

4 に答える 4

1

ALinkedHashMapは にMap相当しLinkedHashSetます。挿入オーダーのトラバーサルを提供し、キーの一意性を保証し、Map. これはあなたにとって代替手段になるかもしれません。

于 2013-05-01T12:09:00.630 に答える
0

私が質問を理解したところから。あなたのLinkedHashSet要件にうまく対応します。

しかし、あなたはすでに正しく実装equals() and hashcode()していると思います。CustomerObject

それで:

一意の値を保存する

セットにはその機能があります。

追加しようとしたときに特定の要素が既に存在する場合は、その要素を返します

equals と hashcode メソッドを使用して、

if (set.contains(obj)) "return" obj;

上記の「return」は、メソッドの return ステートメントではありません。つまり、true が含まれている場合は、挿入したいオブジェクトを取得するだけです。セット内の obj と等しいからです。(セットを繰り返して、等しいオブジェクトを取得する必要はありません)

そして、ハッシュテーブルのためにcontains(obj)がかかります。O(1)

広告掲載順を維持する(可能な場合)

linkedhashSetに基づいてlinkedListいるため、挿入順序が保持されます。

于 2013-05-01T12:29:29.590 に答える
0

電話するだけcontains()です。O(1)と指定されています。

于 2013-05-01T11:49:31.543 に答える