1

以下の形式の ConcurrentHashMap があります。

ConcurrentHashMap<String,ConcurrentHashMap<String,ArrayList>>

このマップでは、配列リスト内の特定の値を削除したいと考えています。誰でもこれをガイドできますか?

EDIT1: マップがあります <"packet1"--><"NR1",[Pr1,Pr2]>> <"packet1"--><"NR2",[Pr1,Pr2]>>

map.get("packet1").get("NR1").remove("Pr2") を削除すると、NR1 と NR2 の両方から Pr2 が削除されます。Isnt は NR1 からのみ削除する必要があります。私を更新してください、

PS : NR1 と NR2 の両方の値を持つ同じキー packet1 の 2 回目のマップを更新します。

4

3 に答える 3

2

あなたは単にそうする

// Get hold of the map containing the list
Map<String, ArrayList> innerMap = yourMap.get("primaryKey");

// Get hold of the list
ArrayList listToRemoveFrom = innerMap.get("secondaryKey");

// Remove from the list
listToRemoveFrom.remove(objectToRemove);

または、1 行で:

yourMap.get("yourPrimaryKey").get("yourSecondaryKey").remove(objectToRemove);

Jim Garrison が指摘しているように、マップに が含まれて"yourPrimaryKey"おり、内側のマップに が含まれていることが確実でない限り、それぞれの場合に s"yourSecondaryKey"を確認する必要があります。null


補足として: ジェネリックを最後まで使用ArrayListし、マップを

ConcurrentHashMap<String,ConcurrentHashMap<String,ArrayList<SomeType>>>
                                                           ^^^^^^^^^^

または、可能であればインターフェイスに対してコーディングし、次のように記述します。

Map<String,Map<String,List<SomeType>>>
于 2012-03-10T07:19:25.740 に答える
2
map.get("key1").get("key2").remove(particularValue);

このような構造を見るたびにKey、2 つの String キーを含み、equals と hashCode を適切に実装するクラスが代わりに使用されないのはなぜだろうかと思います。マップは になりますMap<Key, List<Foo>>

を使用して (Guava を使用して) 実装MultiMap<Key, Foo>することもできます。これにより、使用と保守が容易になります。

于 2012-03-10T07:19:57.607 に答える
1

マップの設定を間違えました。NR1とNR2のリストを追加したときは、同じリストオブジェクトを使用しました。これで、マップにそのリストへの2つの参照が含まれます。NR1リストから要素を削除すると、NR2の下に表示されているのと同じリストから要素が削除されます。

解決策は、コードを修正して、マップにリストを挿入するときに、キーごとに異なるリストを挿入するようにすることです。

あなたはJBの投稿へのコメントであなたはこれをしなかったと言います。実際、あなたこれをしました。あなたはまだそれを実現していません!

于 2012-03-10T09:27:39.697 に答える