1

我有一组带有多维哈希图的集合,如下所示:

Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();

我在删除 HashMap 条目时遇到问题。我知道顶级哈希映射的键,但不知道底层哈希映射中的任何数据。我正在尝试通过以下方式删除集合中的哈希映射条目:

一世。

Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();

... Add some hashmaps to the set, then ...

String myKey = "target_key";
setInQuestion.remove(myKey);

二、

Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();

... Add some hashmaps to the set, then ...

String myKey = "key_one"; //Assume a hashmap has been added with this top level key
HashMap<String, HashMap<String, String>> removeMap = new HashMap<String, HashMap<String, String>>();
HashMap<String, String> dummyMap = new HashMap<String, String>();
removeMap.put(myKey, dummyMap);
setInQuestion.remove(removeMap);

这些方法都不起作用。如果我只知道顶级哈希图的键,我将如何删除集合中的条目?

4

3 回答 3

2

Collection.remove()要求对象相等。各种 jdk Map 实现实现相等意味着所有键/值必须匹配。由于您传递给remove()调用的所有对象都不会与 Set 中的任何映射“相等”,因此不会删除任何内容。

做您想做的事情的唯一方法是自己遍历 Set 以找到匹配的 Map (或者,将 Set 设置为以该特殊键为键的 Map )。

于 2012-08-27T17:39:59.103 回答
0

感谢 jtahlborn 的指导。想发布我根据您的回答找到的解决方案:

String myKey = "Key_In_Question";
Iterator mySetIterator = myHashSet.iterator();
while(mySetIterator.hasNext()) {
    HashMap<String, HashMap<String, String>> entry = (HashMap<String, HashMap<String, String>>) mySetIterator.next();
    if(entry.containsKey(myKey)) {
        myHashSet.remove(entry);
    }
}
于 2012-08-27T17:50:42.050 回答
0

抱歉,我无法将此作为评论发布。我想指出@jtahlborn 关于Map平等的观点是合同中明确定义的部分......请参阅Map.equals

... 两个映射m1m2表示相同的映射 if m1.entrySet().equals(m2.entrySet())。这确保了 equals 方法在Map接口的不同实现中正常工作。

Map.Entry.equals措辞类似。

...两个条目e1e2表示相同的映射如果

     (e1.getKey()==null ?
       e2.getKey()==null : e1.getKey().equals(e2.getKey()))  &&
      (e1.getValue()==null ?
       e2.getValue()==null : e1.getValue().equals(e2.getValue()))

这可确保该方法在接口equals的不同实现中正常工作。Map.Entry

于 2012-08-27T18:05:45.273 回答