1

次のように、多次元ハッシュマップを含むセットがあります。

Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();

HashMap エントリの削除に問題があります。最上位のハッシュマップのキーはわかっていますが、基になるハッシュマップのデータはわかりません。次の方法で、セット内のハッシュマップ エントリを削除しようとしています。

私。

Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();

... Add some hashmaps to the set, then ...

String myKey = "target_key";
setInQuestion.remove(myKey);

Ⅱ.

Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();

... Add some hashmaps to the set, then ...

String myKey = "key_one"; //Assume a hashmap has been added with this top level key
HashMap<String, HashMap<String, String>> removeMap = new HashMap<String, HashMap<String, String>>();
HashMap<String, String> dummyMap = new HashMap<String, String>();
removeMap.put(myKey, dummyMap);
setInQuestion.remove(removeMap);

これらの方法はどちらも機能しません。トップレベルのハッシュマップのキーしか知らない場合、セット内のエントリを削除するにはどうすればよいですか?

4

3 に答える 3

2

Collection.remove()オブジェクトの等価性が必要です。さまざまな jdk Map 実装は、すべてのキー/値が一致する必要があることを意味する等価性を実装しています。呼び出しに渡すオブジェクトremove()はセット内のどのマップとも「等しい」ものではないため、何も削除されません。

必要なことを行う唯一の方法は、セットを自分で反復処理して、一致するマップを見つけることです (または、セットをその特別なキーにキー付けされたマップにします)。

于 2012-08-27T17:39:59.103 に答える
0

指導してくれた jtahlborn に感謝します。あなたの答えの結果として私が見つけた解決策を投稿したかった:

String myKey = "Key_In_Question";
Iterator mySetIterator = myHashSet.iterator();
while(mySetIterator.hasNext()) {
    HashMap<String, HashMap<String, String>> entry = (HashMap<String, HashMap<String, String>>) mySetIterator.next();
    if(entry.containsKey(myKey)) {
        myHashSet.remove(entry);
    }
}
于 2012-08-27T17:50:42.050 に答える
0

コメントとして投稿できませんでした。平等に関する@jtahlbornのポイントMapは、契約の明確に定義された部分であることを指摘したかった...参照Map.equals.

... 2 つのマップは同じマッピングm1を表します。これにより、インターフェイスのさまざまな実装で equals メソッドが適切に機能することが保証されます。m2m1.entrySet().equals(m2.entrySet())Map

Map.Entry.equalsと同じように言い表されます。

... 2 つのエントリで、同じマッピングe1を表す場合e2

     (e1.getKey()==null ?
       e2.getKey()==null : e1.getKey().equals(e2.getKey()))  &&
      (e1.getValue()==null ?
       e2.getValue()==null : e1.getValue().equals(e2.getValue()))

これにより、equalsメソッドがインターフェイスのさまざまな実装で適切に機能することが保証されMap.Entryます。

于 2012-08-27T18:05:45.273 に答える