我正在学习HashMap
课程,并编写了这个简单的程序。
这段代码适用于向hashmap添加元素,同时从hashmap中删除元素,我遇到java.util.ConcurrentModificationException
例如,这是我的终端的副本,
[ravi@doom test]$ java TestHashMap
.....MENU.....
1. Add
2. remove key
3. remove value
4. display
7. Exit
Your choice :1
Key : A
Value : 1
Key/Value : (A,1) added to storage.
.....MENU.....
1. Add
2. remove key
3. remove value
4. display
7. Exit
Your choice :1
Key : B
Value : 2
Key/Value : (B,2) added to storage.
.....MENU.....
1. Add
2. remove key
3. remove value
4. display
7. Exit
Your choice :1
Key : C
Value : 3
Key/Value : (C,3) added to storage.
.....MENU.....
1. Add
2. remove key
3. remove value
4. display
7. Exit
Your choice :1
Key : D
Value : 4
Key/Value : (D,4) added to storage.
.....MENU.....
1. Add
2. remove key
3. remove value
4. display
7. Exit
Your choice :4
( D , 4 );
( A , 1 );
( B , 2 );
( C , 3 );
.....MENU.....
1. Add
2. remove key
3. remove value
4. display
7. Exit
Your choice :2
Key to REMOVE :
D
Pair (D,4) Removed.
.....MENU.....
1. Add
2. remove key
3. remove value
4. display
7. Exit
Your choice :4
( A , 1 );
( B , 2 );
( C , 3 );
.....MENU.....
1. Add
2. remove key
3. remove value
4. display
7. Exit
Your choice :3
Enter Value to remove : 2
Key : B Removed.
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:922)
at java.util.HashMap$EntryIterator.next(HashMap.java:962)
at java.util.HashMap$EntryIterator.next(HashMap.java:960)
at TestHashMap.start(TestHashMap.java:60)
at TestHashMap.main(TestHashMap.java:87)
ABRT problem creation: 'success'
码
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
class TestHashMap
{
private Map<String,Integer> map;
public TestHashMap()
{
map = new HashMap<String,Integer>();
}
public void displayMenu()
{
System.out.println(".....MENU.....");
System.out.println("1. Add");
System.out.println("2. remove key");
System.out.println("3. remove value");
System.out.println("4. display");
System.out.println("7. Exit");
System.out.print("Your choice :");
}
public void start()
{
Scanner input = new Scanner(System.in);
int menuChoice,value;
String key;
while(true)
{
displayMenu();
menuChoice = input.nextInt();
switch(menuChoice)
{
case 1:
System.out.print("\n Key : ");
input.nextLine();
key = input.nextLine();
System.out.print("\n Value : ");
value = input.nextInt();
map.put(key,new Integer(value));
System.out.println("Key/Value : ("+key+","+value+") added to storage.");
break;
case 2:
System.out.println("Key to REMOVE : ");
input.nextLine();
key = input.nextLine();
Integer v = map.get(key);
if(v == null)
System.out.println("No value exists for key "+key);
else
{
map.remove(key);
System.out.println("Pair ("+key+","+v.intValue()+") Removed.");
}
break;
case 3:
System.out.print("Enter Value to remove : ");
value = input.nextInt();
if(map.containsValue(new Integer(value)))
{
for(Map.Entry<String,Integer> entry : map.entrySet() )
{
if(entry.getValue().intValue() == value)
{
System.out.println("Key : "+entry.getKey()+" Removed.");
map.remove(entry.getKey());
}
}
}
break;
case 4:
for(Map.Entry<String,Integer> entry : map.entrySet() )
{
System.out.println("( "+entry.getKey()+" , "+entry.getValue()+" );");
}
break;
case 7:
input.close();
System.exit(0);
default:
System.out.println("Invalid Choice !");
}
}
}
public static void main(String args[])
{
TestHashMap thm = new TestHashMap();
thm.start();
}
}
更新:工作代码
感谢你们( rgettman , Nathan Hughes )。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Iterator;
class TestHashMap
{
private Map<String,Integer> map;
public TestHashMap()
{
map = new HashMap<String,Integer>();
}
public void displayMenu()
{
System.out.println(".....MENU.....");
System.out.println("1. Add");
System.out.println("2. remove key");
System.out.println("3. remove value");
System.out.println("4. display");
System.out.println("7. Exit");
System.out.print("Your choice :");
}
public void start()
{
Scanner input = new Scanner(System.in);
int menuChoice,value;
String key;
while(true)
{
displayMenu();
menuChoice = input.nextInt();
switch(menuChoice)
{
case 1:
System.out.print("\n Key : ");
input.nextLine();
key = input.nextLine();
System.out.print("\n Value : ");
value = input.nextInt();
map.put(key,new Integer(value));
System.out.println("Key/Value : ("+key+","+value+") added to storage.");
break;
case 2:
System.out.println("Key to REMOVE : ");
input.nextLine();
key = input.nextLine();
Integer v = map.get(key);
if(v == null)
System.out.println("No value exists for key "+key);
else
{
map.remove(key);
System.out.println("Pair ("+key+","+v.intValue()+") Removed.");
}
break;
case 3:
System.out.print("Enter Value to remove : ");
value = input.nextInt();
if(map.containsValue(new Integer(value)))
{
for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();it.hasNext();)
{
Map.Entry<String,Integer> x = it.next();
if(x.getValue().intValue() == value)
{
key = x.getKey();
it.remove();
System.out.println("Key : "+key+" Removed.");
}
}
}
break;
case 4:
for(Map.Entry<String,Integer> entry : map.entrySet() )
{
System.out.println("( "+entry.getKey()+" , "+entry.getValue()+" );");
}
break;
case 7:
input.close();
System.exit(0);
default:
System.out.println("Invalid Choice !");
}
}
}
public static void main(String args[])
{
TestHashMap thm = new TestHashMap();
thm.start();
}
}
答案 0 :(得分:8)
你的for循环获取map.entrySet并使用它上面的迭代器来处理映射条目(这个版本的for循环需要一个Iterable,它从Iterable获取迭代器)。在地图上使用迭代器时,如果不使用该迭代器从地图中删除内容,则会得到ConcurrentModificationException。这是告诉迭代者它已经过时的地图。
您可以使用迭代器显式编写for循环,如下所示:
for (Iterator<Map.Entry<String, Integer> it = map.entrySet().iterator();
it.hasNext();) {
并在需要删除条目时使用iterator的remove方法。
答案 1 :(得分:6)
当您在remove
上进行迭代时,您正在呼叫Map
。此行(增强的for循环)隐式运行Iterator
:
for(Map.Entry<String,Integer> entry : map.entrySet() )
当Iterator
检测到其集合被修改时,它会抛出ConcurrentModificationException
。但是,您可以在remove()
上调用Iterator
,而不会抛出该异常。明确使用Iterator
:
Iterator<Map.Entry<String, Integer>> itr = map.entrySet().iterator();
while(itr.hasNext())
{
Map.Entry<String, Integer> entry = itr.next();
if(entry.getValue().intValue() == 2)
{
System.out.println("Key : "+entry.getKey()+" Removed.");
itr.remove(); // Call Iterator's remove method.
}
}
答案 2 :(得分:1)
您无法从当前正在迭代的地图中删除元素。您可以定义迭代器,或者您可以对块3中的代码进行一些简单的修改。
case 3:
System.out.print("Enter Value to remove : ");
value = input.nextInt();
if(map.containsValue(new Integer(value)))
{
Map.Entry<String,Integer> foo = null;
for(Map.Entry<String,Integer> entry : map.entrySet() )
if(entry.getValue().intValue() == value)
foo = entry;
System.out.println("Key : "+foo.getKey()+" Removed.");
map.remove(foo.getKey());
}
break;
答案 3 :(得分:0)
只需使用Iterator类将迭代元素删除为
for (Iterator<Map.Entry<String, Integer> it = map.entrySet().iterator();
while(it.hasNext()) {
Map.Entry<String, Integer> e= itr.next();
key = e.getKey();
Value = e.getValue();
//Your Other Code Here
it.remove(); //It removes the current Itertaion from Map
}