关于java:HashMap删除条目和位置

HashMap delete entry AND position

我只是在和HashMaps合作,现在它突然出现了一个我自己无法回答的问题…

在我的哈希图中有一些条目。我现在正在搜索所有条目中的某个值。如果找到该值,则使用hashmap.remove();将其删除。但我不想"只"删除条目,而是要删除哈希图的整个"位置",这样它之间就没有空白。最后,hashmap不应该再有任何值了(我认为它将是空的,对吗?)

有没有可能的办法?

这就是我到目前为止得到的,但它只删除条目,而不是整个位置…

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


不能从映射中删除Entry对象。remove方法需要键。

相反,您可以尝试以下操作:

1
2
3
4
5
6
7
8
9
Iterator<Entry<Integer, String>> itr = myMap.entrySet().iterator();

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

此外,在迭代时不能直接在结构上修改映射,否则将出现ConcurrentModification异常。为了防止出现这种情况,需要使用迭代器上的remove方法进行删除,如上面的代码所示。


这是错误的

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

但不能用这种方法删除元素。你会得到ConcurrentModificationException

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

1
2
3
4
5
6
7
8
9
10
11
12
 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);

输出:

1
 {2=hi}

您真的需要查看hashmap remove()。


Because after a certain time I need to check if the HashMap is empty. But another answer seems to get the hint I needed. If I delete the value the entry will be null? Can i do a check if every entry is null easily or do i have to iterate over every entry again?

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

1
myMap.remove(entry);

因为传递了entry对象,所以需要传递映射的键才能删除它,请参见map.html删除文档。

因此

1
myMap.remove(entry.getkey());

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

如果从映射中删除映射,则该映射将不再存在于映射中。bucket是否为null是实现细节,但是当您查询使用给定键删除的映射时,您将得到null作为返回值。如果使用相同的键添加另一个映射,您将再次获得TAHT映射。

您可以使用map isEmpty检查映射是否为空,因此不需要检查每个条目是否为空,也不需要在整个映射上迭代。

您可以使用map检查映射是否包含键的映射。containskey

可以使用map containsValue检查映射是否至少包含一个值的映射

迭代时从地图中删除etriey以使用iterator的正确方法

1
2
3
4
5
6
7
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,我假设你所指的位置是整数键,在这里你可以做一些像myMap.put(1,".")myMap.put(2,"..")myMap.put(3,"...")等等的事情。在这种情况下,如果删除键1的映射,例如,映射{1 :"."}将不再存在于映射中。


了解HashMap如何在此处工作链接。也可以看到这里的Java文档链接。

如果要设置pack-your hashmap,请尝试检查映射的大小,然后删除一个,然后再次检查大小。

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

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


假设您有一个Map大小的10,您想删除当前Map中的8th键值对。发生的情况是,Map变成了9的大小,在8的位置上会有另一个键值对。

你不能超越与remove()的关系。你不能移除这个位置。

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

如:

1
2
3
4
5
6
7
8
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"));

输出:

1
2
3
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()


好吧,我有一个很容易编写的代码示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
}

}