从 java 中的哈希图中删除值的子集

Removal of subset of values from a hashmap in java

您好,我有一个 Map 变量定义如下:

Map<String,List<Event>> myMap = new HashMap<String,List<Event>>();

假设 (key:value) 对是 (abc:(x1,x2,x3)), (pqr:(x2,x4,x5)) 和 (xyz:(x4,x2,x9)) .

现在,要删除我们将执行 myMap.remove("pqr"),但这会删除整个 (key:value) 对集。 但我想要的是只删除 set(x2,x4,x5) 中的 x5 以便它导致 (pqr:(x2,x4)).

请提供一些有效的方法来帮助我实现这一目标。

myMap.put(key, value) 将更新键值对(和 return 原始值),所以我建议只将您想要的新值放在地图中。

简单:

myMap.get(pqr).remove(x5);

考虑到 ArrayList 的值,您必须获取键的值 "pqr" 并按照上面的回答从 arraylist 中删除数据。

我不知道你是否真的可以做到这一点(意思是配置限制),但你似乎有某种 MultiMap 要求。

我建议(如果可以的话)看看一些 MultiMap 实现,例如 Guava。查看相关 here or here

我不知道您的完整规格和要求,但为了决定用于存储事件的结构,您必须考虑是否也需要重复 or/and 排序。

关于效率,由于您需要搜索对象(将其删除),我会选择

Map<String, Set<Event>> myMap = new HashMap<String, Set<Event>>();

Multimap 来自 Guava。

如果您不关心排序,请在 add/remove

上使用 HashSet<Event> O(1)

如果需要自然排序,请在 add/remove

上使用 TreeSet<Event> O(logn)

如果需要插入顺序,请在 add/remove

上使用 LinkedHashSet<Event> O(1)

注意:如果您接受重复项(这是选择 List 而不是 Set 的充分理由),myMap.get(pqr).remove(x5); 只会删除该对象的第一次出现。如果您需要删除 x5 的每一次出现,那么以下将起作用:

myMap.get(pqr).removeAll(Collections.singleton(x5));