在内部HashMap中加载相同的值



我试图将下面的语句输入HashMap

Input Line: Rainy#No:2 Sunny#No:3 Rainy#Yes:3 Sunny#Yes:2 Overcast#Yes:4
Expected Output:{Rainy={No=2,Yes=3},Rainy={No=3,Yes=2},Overcast={Yes=4}}

目前为止我所做的是

import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class StackHash{
/**
*@paramargs
*/
staticConcurrentMap<String,HashMap<String,Integer>>map=newConcurrentHashMap<>();
public static final String TAB="t";
public static final String SPACE=" ";
public static final String HASH="#";
public static final String COLON=":";
public static void main(String[]args){
//TODOAuto-generatedmethodstub
Stringline="Rainy#No:2 Sunny#No:3 Rainy#Yes:3 Sunny#Yes:2 Overcast#Yes:4";
StringTokenizerst=newStringTokenizer(line,SPACE);
HashMap<String,Integer>attibuteCollect=newHashMap<String,Integer>();
while(st.hasMoreTokens()){
 Stringtoken1=st.nextToken();
 String[]parts=token1.split(HASH);
 String[]parts1=parts[1].split(COLON);
 attibuteCollect.put(parts1[0],Integer.parseInt(parts1[1]));
 if(map.isEmpty()){
   map.put(parts[0],attibuteCollect);
 }
 else{
   for(Map.Entry<String,HashMap<String,Integer>>entry:map.entrySet()){
     StringkeyMap=entry.getKey();
     if(keyMap.equals(parts[0])){
       map.put(keyMap,attibuteCollect);
     }
     else{
       map.put(parts[0],attibuteCollect);
     }
 }
}
}
System.out.println("finalmap"+map);
}
}

输出
map {Rainy={Yes=4, No=3}, Sunny={Yes=4, No=3}, Overcast={Yes=4, No=3}}

我做错了什么吗?

请建议。

原因:

你得到了ConcurrentModificationException,因为你在迭代外部map的同时使用put方法修改了内部attibuteCollect映射。

解决方案:

ConcurrentHashMap代替HashMap来解ConcurrentModificationException

  ConcurrentMap<String, HashMap<String,Integer>> map = new ConcurrentHashMap<>();

最新更新