
[英]Exception when removing element from HashMap java.util.ConcurrentModificationException
[英]ConcurrentModificationException error while writing nested hashmap to a file and removing element in Java
我有一个代码,可以从文件中读取内容并按如下方式写入另一个文件中。 输入文件由呼叫日志组成,代码从文件中读取并为特定呼叫创建映射。 特定业务代表可以一次接听一个电话,并且一直在通话中,直到您到达包含“ Hang up
的线路Hang up
。 当代码到达该行时,我应该在文本文件中写入该特定调用的映射内容,并刷新该映射。
inputfile.txt
[DialerManager ] 15:40:35.688 MakeCall,CallId51,9972454323
[RandomId63 ] 15:40:57.562 CallId51 CallTransfer,Jimmy,109
[CallId51 ] 15:40:59.633 RandomId63 CALLSTATUS,CONNECTED
[TempId78 ] 15:51:27.586 Jimmy: Hang up
[DialerManager ] 15:40:35.688 MakeCall,CallId52,1234567890
[RandomId68 ] 15:40:57.562 CallId52 CallTransfer,James,100
[CallId52 ] 15:40:59.633 RandomId68 CALLSTATUS,CONNECTED
[TempId74 ] 15:51:27.586 James: Hang up
[DialerManager ] 15:40:35.688 MakeCall,CallId53,3456780912
[DialerManager ] 15:40:40.688 MakeCall,CallId54,9807652341
[RandomId01 ] 15:40:57.562 CallId53 CallTransfer,John,80
[CallId53 ] 15:40:59.633 RandomId01 CALLSTATUS,CONNECTED
[RandomId600 ] 15:40:57.562 CallId51 CallTransfer,Jimmy,109
[CallId54 ] 15:40:59.633 RandomId600 CALLSTATUS,CONNECTED
[TempId100 ] 15:53:27.586 John: Hang up
[TempId345 ] 15:56:27.586 Jimmy: Hang up
在这里,我想为每个呼叫创建一个地图,然后在到达Hang up
时刷新该地图。 然后,接收方将继续进行新的呼叫,从而为接收方创建新的地图。 我有下面的代码。
代码
import java.io.*;
import java.util.HashMap;
public class ParseMapTest {
public static void main(String[] args) throws IOException {
BufferedReader reader;
HashMap<String, HashMap<String, String>> hMap = new HashMap<>();
try {
reader = new BufferedReader(new FileReader("mapEx.txt"));
String line;
while ((line = reader.readLine()) != null) {
if (line.contains("MakeCall")) {
String[] words = line.split(",|:| ");
for (int i = 0; i < words.length; i++) {
if (words[i].startsWith("CallId")) {
String header = words[i];
if (!hMap.containsKey(header)) {
hMap.put(header, new HashMap<>());
}
}
}
} else if (line.contains("CallTransfer")) {
String header = line.split(" ")[4];
// System.out.println(header);
if (hMap.get(header) == null) {
hMap.put(header, new HashMap<>());
}
hMap.get(header).put("Agent", line.split(",")[1]);
hMap.get(header).put("AgentId", line.split(",")[2]);
} else if (line.contains("CALLSTATUS")) {
String headerBrack = line.split(" ")[0];
String header = headerBrack.replaceAll("[\\[]", "");
if (hMap.get(header) == null) {
hMap.put(header, new HashMap<>());
}
String[] lineSplit = line.split(",");
hMap.get(header).put("CALLSTATUS", lineSplit[lineSplit.length - 1]);
} else if (line.contains("Hang Up")) {
String agent = line.split("\\.|:")[3].substring(4);
for(String s: hMap.keySet()){
HashMap<String, String> switchMap = hMap.get(s);
if(switchMap.containsValue(agent)) {
System.out.println(s + hMap.get(s));
String map = s + hMap.get(s);
FileWriter fw = new FileWriter("out.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw);
out.println(map);
out.close();
hMap.remove(s);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(hMap);
}
}
我正在创建文件out.txt ,在其中编写已到达Hang up
的内部地图,并将其从hMap
删除,但我正在获取java.util.ConcurrentModificationException
。 我该如何纠正错误? 提前致谢!
当您尝试从循环中从ArrayList或Hashmap中删除项目时,会发生此异常。 为避免此类异常,请对要删除的项目创建单独的ArrayList,然后在单独的循环中删除这些项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.