繁体   English   中英

在将嵌套哈希图写入文件并在Java中删除元素时发生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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM