我正在与HashMaps
合作,现在它出现了一个我实际上无法自己回答的问题......
在我的HashMap中有一些条目。我现在正在搜索所有条目以获取特定值。如果找到该值,则使用hashmap.remove();
将其删除。但我不会只是"想要删除条目,但整个"位置" HashMap的内容,以便它之间没有空格。最后,HashMap不再具有任何价值(我认为它会为空,然后赢了?)
有没有办法可以这样做?
这是我到目前为止所得到的,但它只删除了不是整个位置的条目...
for (Entry<Integer, String> entry : myMap.entrySet()) {
if (entry.getValue().contains("EnterStringHere")) {
myMap.remove(entry);
}
}
答案 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)
了解HashMap
在Link的工作原理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
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
}
}