HashSet中的Java存储和HashMap查找

时间:2012-08-27 17:35:16

标签: java hashmap hashset

我有一个包含多维哈希图的集合,如下所示:

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

我在删除HashMap条目时遇到问题。我知道顶级hashmap的关键,但不知道底层hashmap中的任何数据。我试图以这些方式删除集合中的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);

II。

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

这两种方法都不起作用。如果我只知道顶级hashmap的密钥,我将如何删除集合中的条目?

3 个答案:

答案 0 :(得分:2)

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

执行所需操作的唯一方法是迭代自己设置以找到匹配的Map(或者将Set设置为键入该特殊键的Map)。

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

答案 2 :(得分:0)

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

  

...如果m1,则两个地图m2m1.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接口的不同实现中正常工作。