Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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 Complile错误ConcurrentModificationException,尝试使用方法删除相同的名称_Java_Hashmap_Static Methods - Fatal编程技术网

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
一起工作,但是当我开始编译代码时,我得到了ConcurrentModificationException
removeItemFromMapByValue
必须删除值中的相同名称

    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、 它会