Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap删除条目和位置_Java_Hashmap - Fatal编程技术网

Java HashMap删除条目和位置

Java HashMap删除条目和位置,java,hashmap,Java,Hashmap,我只是在处理HashMaps,现在它弹出了一个我自己无法回答的问题 在我的HashMap中有一些条目。我现在在所有条目中搜索某个值。如果找到该值,则使用hashmap.remove()将其删除。但是我不想“仅仅”删除条目,而是要删除HashMap的整个“位置”,这样它之间就没有空格了。最后,HashMap应该不再有任何值了(我认为它将是空的,不是吗?) 有没有可能的办法 这是我目前得到的,但它只删除了条目,而不是整个位置 for (Entry<Integer, String> ent

我只是在处理HashMaps,现在它弹出了一个我自己无法回答的问题

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

有没有可能的办法

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

for (Entry<Integer, String> entry : myMap.entrySet()) {
    if (entry.getValue().contains("EnterStringHere")) {
        myMap.remove(entry);
    }
}
for(条目:myMap.entrySet()){
if(entry.getValue()包含(“EnterStringHere”)){
myMap.remove(条目);
}
}

假设您有一个
映射
大小为
10
,并且希望删除当前
映射
中的
8
第个键值对。发生的情况是,
Map
变为
9
的大小,在
8
th位置将有另一个键值对

您不能使用
remove()
来超越这一点。您不能删除该位置

但是当您使用
Map.get(已删除\u键)
时,您将获得
null
,因为现在没有键

例如:


如果您想检查地图是否为空,则添加此选项可为您的评论提供答案。只需使用
map.isEmpty()
就可以理解
HashMap
在这里的工作原理。 这里也可以看到java文档

如果您想设置打包您的hashmap,请尝试检查映射的大小,然后删除一个,然后再次检查大小(例如)

hashmap.size();        => 10
hashmap.remove(obj);
hashmap.size()         => 9
这意味着hashmap已打包,不会有任何空条目。最后hashmap将自动在其中不包含任何值

这是错误的

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

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"
 {2=hi}

您确实需要查看

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

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

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

        while(itr.hasNext()) {
            Entry<Integer, String> entry = itr.next();
            if (entry.getValue().contains("EnterStringHere")) 
            { 
                itr.remove(); 
            }
        }
Iterator itr=myMap.entrySet().Iterator();
while(itr.hasNext()){
Entry=itr.next();
if(entry.getValue()包含(“EnterStringHere”))
{ 
itr.remove();
}
}

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

好的,我得到了一个非常简单的可编码示例

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
}
公共类测试输出{
公共静态void main(字符串[]args){
HashMap myMap=新HashMap();
myMap.put(123,“你好”);
myMap.put(234,“再见”);
myMap.put(789,“asdf”);
System.out.println(myMap);//上面写着:
{789=asdf,234=Bye,123=hello}
System.out.println(myMap.size());//上面写着:“3”
for(条目:myMap.entrySet()){
if(entry.getValue()包含(“hello”)){
myMap.remove(条目);
}
}
System.out.println(myMap);//上面写着:
{789=asdf,234=Bye,123=hello}
System.out.println(myMap.size());//它再次显示:“3”
}
}

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

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

myMap.remove(entry);
因为您传递了entry对象,所以需要传递映射的键才能删除它,请参见文档

因此

但是,使用当前方法,您将在
ConcurrentModificationException
中运行。如果到现在还没有,那只是因为代码没有删除任何内容,因为您传递了entry对象

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

您可以使用检查映射是否为空,因此不需要检查每个条目是否为空或迭代整个映射即可

您可以使用以下命令检查映射是否包含键的映射:

您可以使用以下命令检查映射是否包含值的至少一个映射:

迭代时从映射中删除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();
    }
}
Iterator Iterator=myMap.entrySet().Iterator();
while(iterator.hasNext()){
Entry=iterator.next();
if(entry.getValue()包含(“foo”)){
iterator.remove();
}
}

由于您有
Map
我假设您所指的位置是整数键,在这里您可以执行类似
myMap.put(1,“.”
myMap.put(2,“…”)
myMap.put(3,“…”
等操作。在这种情况下,如果您删除键
1
的映射,例如,该位置,即映射
{1:“}
将不再存在于映射中。

向我们显示您的代码,特别是在所有条目中搜索某个值的部分。您可以共享您现有的代码吗?我不确定是否理解该问题。删除条目时是否希望HashMap使用更少的存储桶?你为什么在乎?。。。为什么要让hashmap变短?定义“删除位置”的含义。发生了什么,你希望发生什么?hashmap没有“位置”,所以很难理解您的意思。此外,您的代码将导致ConcurrentModificationException。使用迭代器删除条目。不能使用for each删除元素。您将获得ConcurrentModificationException。什么哟
myMap.remove(entry);
myMap.remove(entry.getkey());
Iterator<Entry<Integer, String>> iterator = myMap.entrySet().iterator();
while(iterator.hasNext()) {
    Entry<Integer, String> entry = iterator.next();
    if (entry.getValue().contains("foo")) {
        iterator.remove();
    }
}