我有以下格式的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
答案 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的帖子时说你没有这样做。事实是,你做了这样做。你还没有意识到它!