如何从此ConcurrentHashMap中删除值<string,concurrenthashmap <string,arraylist>&gt; </string,concurrenthashmap <string,arraylist>

时间:2012-03-10 07:17:43

标签: java concurrenthashmap

我有以下格式的ConcurrentHashMap:

ConcurrentHashMap<String,ConcurrentHashMap<String,ArrayList>>

现在在这张地图中,我想要删除数组列表中的特定值。任何人都可以使用此指南。

EDIT1: 我有一张地图 &LT; “packet1” - &GT;&LT; “NR1”,[PR1,PR2] GT;&GT; &LT; “packet1” - &GT;&LT; “NR 2”,[PR1,PR2] GT;&GT;

现在当我删除map.get(“packet1”)。get(“NR1”)。remove(“Pr2”)它从NR1和NR2中删除Pr2 .Isnt应该只从NR1.Am中移除我做错了什么here.plz更新我,

P.S:我为同一个密钥包1第二次更新了地图,其值为NR1和NR2

3 个答案:

答案 0 :(得分: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);

或者,在一行中:

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

Jim Garrison指出,除非您确定地图中包含"yourPrimaryKey",并且您的内部地图包含"yourSecondaryKey",否则您需要在每种情况下检查null。< / p>


作为旁注:我建议您一直使用泛型,并通过将地图声明为

来指定ArrayList将包含的元素类型
ConcurrentHashMap<String,ConcurrentHashMap<String,ArrayList<SomeType>>>
                                                           ^^^^^^^^^^

或者,更好的是,如果可能的话,编写针对接口的代码,然后编写

Map<String,Map<String,List<SomeType>>>

答案 1 :(得分:2)

map.get("key1").get("key2").remove(particularValue);

每当我看到这样的结构时,我想知道为什么不使用包含两个String键并正确实现equals和hashCode的Key类。然后地图将成为Map<Key, List<Foo>>

甚至应该使用MultiMap<Key, Foo>来实现(使用Guava),这将使其更易于使用和维护。

答案 2 :(得分:1)

你在设置地图时犯了一个错误。当您添加NR1和NR2的列表时,您使用了相同的列表对象。您的地图现在包含对该列表的两个引用。从NR1列表中删除元素时,您将从NR2下可见的相同列表中删除该元素。

解决方案是修复代码,以便在向地图中插入列表时,为每个键插入不同的列表。

你在评论JB的帖子时说你没有这样做。事实是,你做了这样做。你还没有意识到它!