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 中删除。我在这里做错什么了吗.plz告诉我,

PS:我第二次更新了同一个键 packet1 的地图,同时具有 NR1 和 NR2 的值

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);

或者,在一行中:

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

正如吉姆加里森指出的那样,除非您确定您的地图包含"yourPrimaryKey",并且您的内部地图包含您需要在每种情况下"yourSecondaryKey"检查s 。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包含两个 String 键并正确实现 equals 和 hashCode 的类。然后地图将变为Map<Key, List<Foo>>.

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

于 2012-03-10T07:19:57.607 回答
1

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

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

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

于 2012-03-10T09:27:39.697 回答