Java Complile错误ConcurrentModificationException,尝试使用方法删除相同的名称
我试图让我的Java Complile错误ConcurrentModificationException,尝试使用方法删除相同的名称,java,hashmap,static-methods,Java,Hashmap,Static Methods,我试图让我的removietemfromMapByValue方法与removietemfromMapByValue一起工作,但是当我开始编译代码时,我得到了ConcurrentModificationExceptionremoveItemFromMapByValue必须删除值中的相同名称 public class Solution { public static HashMap<String, String> createMap()
removietemfromMapByValue
方法与removietemfromMapByValue
一起工作,但是当我开始编译代码时,我得到了ConcurrentModificationExceptionremoveItemFromMapByValue
必须删除值中的相同名称
public class Solution
{
public static HashMap<String, String> createMap()
{
HashMap<String, String> map = new HashMap<String, String>();
map.put("Stallone", "Silvest");
map.put("Morikone", "Enio");
map.put("Vivaldi","Antonio");
map.put("Belucci", "Monica");
map.put("Gudini", "Harry");
map.put("Verdo", "Dhuzeppe");
map.put("Maracci", "Bruno");
map.put("Carleone", "Vito");
map.put("Bracco", "Luka");
map.put("Stradivari", "Antonio");
return map;
}
public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
{
for (Map.Entry<String, String> pair : map.entrySet()){
String name = pair.getValue();
removeItemFromMapByValue(map, name);
}
}
public static void removeItemFromMapByValue(HashMap<String, String> map, String value)
{
HashMap<String, String> copy = new HashMap<String, String>(map);
for (Map.Entry<String, String> pair: copy.entrySet())
{
if (pair.getValue().equals(value))
map.remove(pair.getKey());
}
}
public static void main(String[] args)
{
HashMap<String, String> map = createMap();
removeTheFirstNameDuplicates(map);
System.out.println(map);
}
}
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:926)
at java.util.HashMap$EntryIterator.next(HashMap.java:966)
at java.util.HashMap$EntryIterator.next(HashMap.java:964)
at com.javarush.test.level08.lesson08.task05.Solution.removeTheFirstNameDuplicates(Solution.java:32)
at com.javarush.test.level08.lesson08.task05.Solution.main(Solution.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Process finished with exit code 1
公共类解决方案
{
公共静态HashMap createMap()
{
HashMap=newHashMap();
地图放置(“史泰龙”、“西尔维斯特”);
地图放置(“Morikone”、“Enio”);
地图放置(“维瓦尔第”、“安东尼奥”);
地图放置(“贝鲁奇”、“莫妮卡”);
地图放置(“古迪尼”、“哈利”);
地图放置(“Verdo”、“Dhuzeppe”);
地图放置(“马拉奇”、“布鲁诺”);
地图放置(“Carleone”、“Vito”);
地图放置(“布拉科”、“卢卡”);
地图放置(“斯特拉迪瓦里”、“安东尼奥”);
返回图;
}
公共静态void移除FirstNameDuplicates(HashMap映射)
{
for(Map.Entry对:Map.entrySet()){
字符串名称=pair.getValue();
removeItemFromMapByValue(映射,名称);
}
}
公共静态void removietemfromMapByValue(HashMap映射,字符串值)
{
HashMap copy=新的HashMap(map);
for(Map.Entry对:copy.entrySet())
{
if(pair.getValue().equals(value))
map.remove(pair.getKey());
}
}
公共静态void main(字符串[]args)
{
HashMap=createMap();
移除FirstNameDuplicates(地图);
系统输出打印项次(map);
}
}
线程“main”java.util.ConcurrentModificationException中出现异常
位于java.util.HashMap$HashIterator.nextery(HashMap.java:926)
在java.util.HashMap$EntryIterator.next(HashMap.java:966)
在java.util.HashMap$EntryIterator.next(HashMap.java:964)
在com.javarush.test.level08.lesson08.task05.Solution.removeTheFirstNameDuplicates(Solution.java:32)
位于com.javarush.test.level08.lesson08.task05.Solution.main(Solution.java:52)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
进程已完成,退出代码为1
此处:
for (Map.Entry<String, String> pair : map.entrySet()){
String name = pair.getValue();
removeItemFromMapByValue(map, name); //you are about to delete a map item here!
}
(Map.Entry对:Map.entrySet())的{
字符串名称=pair.getValue();
removeItemFromMapByValue(映射,名称);//您将在此处删除映射项!
}
您正在修改当前通过==>循环的集合:
for (Map.Entry<String, String> pair : map.entrySet()){
String name = pair.getValue();
removeItemFromMapByValue(map, name); //you are about to delete a map item here!
}
(Map.Entry对:Map.entrySet())的{
字符串名称=pair.getValue();
removeItemFromMapByValue(映射,名称);//您将在此处删除映射项!
}
您正在修改当前正在循环的集合==>简单的解决方案是修复第一种方法,因为这将避免错误并正确操作
// remove any duplicated values, leaving one entry.
public static void removeTheFirstNameDuplicates(HashMap<String, String> map) {
Map<K,V> map2 = invert(invert(map));
map.clear();
map.putAll(map2);
}
public static <K, V> Map<V, K> invert(Map<K, V> map) {
Map<V, K> map2 = new HashMap<>();
for(Map.Entry<K< V> entry: map.entrySet())
map2.put(entry.getValue(), entry.getKey());
return map2;
}
//删除所有重复的值,留下一个条目。
公共静态void移除FirstNameDuplicates(HashMap映射){
Map map2=反转(反转(Map));
map.clear();
map.putAll(map2);
}
公共静态地图反转(地图地图){
Map map2=新的HashMap();
对于(Map.Entry:Map.entrySet())
put(entry.getValue(),entry.getKey());
返回map2;
}
编译器不会生成ConcurrentModificationException。您应该查看堆栈轨迹中的行,以查看在迭代集合时修改集合的位置,例如
for (Map.Entry<String, String> pair: copy.entrySet())
{
if (pair.getValue().equals(value))
map.remove(pair.getKey());
}
(Map.Entry对:copy.entrySet())的
{
if(pair.getValue().equals(value))
map.remove(pair.getKey());
}
在这种情况下,您将在迭代时删除一个条目。一个简单的解决方案是直接使用迭代器。通常您可以使用IDE进行重构
for (Iterator<String> iter = copy.values().iterator(); iter.hasNext();) {
if (iter.next().equals(value))
iter.remove();
}
for(Iterator iter=copy.values().Iterator();iter.hasNext();){
if(iter.next().equals(value))
iter.remove();
}
此解决方案的问题是,它是从嵌套的中调用的,它将删除所有匹配项,就像它在代码中所做的那样。i、 e.它将删除所有条目。简单的解决方案是修复第一个方法,因为这将避免错误并正确操作
// remove any duplicated values, leaving one entry.
public static void removeTheFirstNameDuplicates(HashMap<String, String> map) {
Map<K,V> map2 = invert(invert(map));
map.clear();
map.putAll(map2);
}
public static <K, V> Map<V, K> invert(Map<K, V> map) {
Map<V, K> map2 = new HashMap<>();
for(Map.Entry<K< V> entry: map.entrySet())
map2.put(entry.getValue(), entry.getKey());
return map2;
}
//删除所有重复的值,留下一个条目。
公共静态void移除FirstNameDuplicates(HashMap映射){
Map map2=反转(反转(Map));
map.clear();
map.putAll(map2);
}
公共静态地图反转(地图地图){
Map map2=新的HashMap();
对于(Map.Entry:Map.entrySet())
put(entry.getValue(),entry.getKey());
返回map2;
}
编译器不会生成ConcurrentModificationException。您应该查看堆栈轨迹中的行,以查看在迭代集合时修改集合的位置,例如
for (Map.Entry<String, String> pair: copy.entrySet())
{
if (pair.getValue().equals(value))
map.remove(pair.getKey());
}
(Map.Entry对:copy.entrySet())的
{
if(pair.getValue().equals(value))
map.remove(pair.getKey());
}
在这种情况下,您将在迭代时删除一个条目。一个简单的解决方案是直接使用迭代器。通常您可以使用IDE进行重构
for (Iterator<String> iter = copy.values().iterator(); iter.hasNext();) {
if (iter.next().equals(value))
iter.remove();
}
for(Iterator iter=copy.values().Iterator();iter.hasNext();){
if(iter.next().equals(value))
iter.remove();
}
此解决方案的问题是,它是从嵌套的中调用的,它将删除所有匹配项,就像它在代码中所做的那样。i、 它会