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