HashMap删除条目和位置

时间:2014-08-22 07:27:41

标签: java hashmap

我正在与HashMaps合作,现在它出现了一个我实际上无法自己回答的问题......

在我的HashMap中有一些条目。我现在正在搜索所有条目以获取特定值。如果找到该值,则使用hashmap.remove();将其删除。但我不会只是"想要删除条目,但整个"位置" HashMap的内容,以便它之间没有空格。最后,HashMap不再具有任何价值(我认为它会为空,然后赢了?)

有没有办法可以这样做?

这是我到目前为止所得到的,但它只删除了不是整个位置的条目...

for (Entry<Integer, String> entry : myMap.entrySet()) {
    if (entry.getValue().contains("EnterStringHere")) {
        myMap.remove(entry);
    }
}

6 个答案:

答案 0 :(得分:1)

这是错误的

for (Entry<Integer, String> entry : myMap.entrySet()) {
if (entry.getValue().contains("EnterStringHere")) {
    myMap.remove(entry); // you should pass the key to remove
   }
 }

但你不能用这种方式删除元素。您将获得ConcurrentModificationException

您可以尝试使用iterator这种方式在迭代时删除元素。

 Map<Integer,String> map=new HashMap<>();
 map.put(1,"EnterStringHere");
 map.put(2,"hi");
 map.put(3,"EnterStringHere");
 Iterator<Map.Entry<Integer,String>> iterator=map.entrySet().iterator();
 while (iterator.hasNext()){
    Map.Entry<Integer,String> entry=iterator.next();
        if(entry.getValue().equals("EnterStringHere")){
            iterator.remove();
        }
    }
 System.out.println(map);

Out put:

 {2=hi}

您确实需要查看HashMap#remove()

答案 1 :(得分:1)

您无法从地图中删除条目对象。 remove方法需要key。

相反,您可以尝试以下方法: -

Iterator<Entry<Integer, String>> itr = myMap.entrySet().iterator();

        while(itr.hasNext()) {
            Entry<Integer, String> entry = itr.next();
            if (entry.getValue().contains("EnterStringHere")) 
            { 
                itr.remove(); 
            }
        }

此外,您无法在迭代时直接对结构修改Map,否则您将获得ConcurrentModification Exception。为了防止这种情况,您需要使用迭代器上的remove方法进行删除,如上面的代码所示。

答案 2 :(得分:0)

假设您的Map<Key,Value>大小为10,并且您希望删除当前8中的Map个键值对。发生的情况是Map变为9的大小,8位置会有另一个键值对。

你不能超越remove()。你无法移除这个位置。

但是当你使用Map.get(removed_key)时,你会得到null,因为现在没有密钥。

例如:

Map<String,Integer> map=new HashMap<>();
map.put("a",1);
map.put("b",2);
map.put("c", 3);
System.out.println("size of the map "+map.size() +" map is "+map);
map.remove("b");
System.out.println("size of the map "+map.size() +" map is "+map);
System.out.println(map.get("b"));

Out put:

size of the map 3 map is {b=2, c=3, a=1}
size of the map 2 map is {c=3, a=1}
null // you are getting null since there is no key "b"

添加此项以回答您的评论,如果您想检查地图是否为空。只需使用map.isEmpty()

即可

答案 3 :(得分:0)

了解HashMapLink的工作原理link。 另请参阅这里的java doc {{3}}。

如果你想设置包你的hashmap尝试检查地图的大小然后删除一个然后再检查大小,例如。

hashmap.size();        => 10
hashmap.remove(obj);
hashmap.size()         => 9

这意味着hashmap已打包,并且不会有任何空条目。最后,hashmap将自动不包含任何值

答案 4 :(得分:0)

  

因为在一段时间后我需要检查HashMap是否为空。但另一个答案似乎得到了我需要的暗示。如果我删除该值,该条目将为null?我可以检查每个条目是否容易为空,或者我是否必须再次遍历每个条目?

您不会从删除映射的Map中删除值。此代码不会删除任何内容:

myMap.remove(entry);

因为您传递了条目对象,所以您需要传递映射的键才能将其删除,请参阅Map.html#remove docs。

从而

myMap.remove(entry.getkey());

然而,使用当前的方法,您将在ConcurrentModificationException中运行。如果它到目前为止它只是因为你的代码没有删除任何东西,因为你传递了入口对象

如果从地图中删除映射,则映射将不再存在于地图中。存储桶是否为null是实现细节,但是当您使用给定密钥查询已删除的映射时,您将get null作为返回值。如果使用相同的键添加另一个映射,则会再次进行映射。

您可以使用Map#isEmpty检查地图是否为空,因此您无需检查每个条目是否为空或迭代整个地图即可。

您可以使用Map.#containsKey

检查地图是否包含关键字的映射

您可以使用Map#containsValue

检查地图是否包含至少一个值的映射

在迭代使用iterator

时从地图中删除etriey的正确方法
Iterator<Entry<Integer, String>> iterator = myMap.entrySet().iterator();
while(iterator.hasNext()) {
    Entry<Integer, String> entry = iterator.next();
    if (entry.getValue().contains("foo")) {
        iterator.remove();
    }
}

由于您有Map<Integer, String>我认为您的意思是位置是整数键,您可以执行myMap.put(1, ".")myMap.put(2, ".."),{{1 }} 等等。在这种情况下,例如,如果删除键myMap.put(3, "...")的映射,则地图中将不再存在位置,即映射1

答案 5 :(得分:-1)

好的,我有一个可编码的例子很简单。

public class TestingThingsOut {

public static void main(String [] args) {
    HashMap<Integer, String> myMap = new HashMap<Integer, String>();

    myMap.put(123, "hello");
    myMap.put(234, "Bye");
    myMap.put(789, "asdf");

    System.out.println(myMap); // it says:
                                  {789=asdf, 234=Bye, 123=hello}

    System.out.println(myMap.size()); // it says: "3"

    for (Entry<Integer, String> entry : myMap.entrySet()) {
        if (entry.getValue().contains("hello")) {
            myMap.remove(entry);
        }
    }

    System.out.println(myMap); // it says:
                                  {789=asdf, 234=Bye, 123=hello}

    System.out.println(myMap.size()); // it says: "3" again
}

}