java - 尝试更新映射键和值时出现 ConcurrentModificationException

标签 java regex

我正在尝试编写一个程序(无需额外的库),该程序将文本文件作为输入,并制作文本中出现的单词的映射,并具有准确的出现次数。问题是,当我尝试用单词和出现次数填充 HashMap 时,我陷入了困境。您可以在下面找到我正在使用的代码片段:

public class App {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        File file = new File("text.txt");
        StringBuilder sb = new StringBuilder();
        try(BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) {
            String content = br.readLine();
            while(content!=null){
                sb.append(content);
                sb.append(System.lineSeparator());
                content =br.readLine();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        String text = sb.toString();
        String[] wordArray = text.split("\\s|\\.\\s|\\,\\s|\\r\\n");
        System.out.println(wordArray.length);

        LinkedHashMap<String,Integer> wordMap = new LinkedHashMap<>();
        wordMap.put(wordArray[0], 1);
        for(int i=1; i<wordArray.length;i++){
            for(String key : wordMap.keySet()){
                if(key.equals(wordArray[i])){
                    wordMap.put(key, wordMap.get(key)+1);
                } else{
                    wordMap.put(wordArray[i], 1);
                }
            }
        }

        for(String key : wordMap.keySet()){
            System.out.println(key + " : "+ wordMap.get(key));
        }
    }

}

我试图使用迭代器来修改 HashMap,但最终遇到了同样的异常。

另外一件事是我还面临着分割文本的问题。在 wordArray 中存在空值。这些空值出现在该行的最后一个单词之后,所以我认为这些是\r\n 白色符号。不幸的是,在 split 方法中将\r\n 添加到正则表达式没有任何区别。您也能帮助解决这些问题吗?

提前谢谢您!

附注这是我在 stackoverflow 上的第一个问题,很抱歉有任何错误:)

最佳答案

您正在调用 worldMap.put,它会修改 HashMap ,同时迭代 (for(String key : worldMap.keySet()) 正在进行中。迭代键集时键集可能会发生变化。这会导致异常。

关于java - 尝试更新映射键和值时出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26287801/

相关文章:

java - 通过 Java Web 应用程序从查询中下载非常大的结果

java - JPA (Hibernate) : "ORA-02289 Sequence does not exist", 但确实如此

java - jtds 忽略 setFetchSize。如何限制获取大小?

javascript - 什么是删除大写字母之间的空格但保留单词之间的空格的正则表达式?

c++ - 处理 Qt5 中 QRegularExpressions 中的重音字母

java - 测试其余 Controller 时出现断言错误预期为 :200 Actual :404

java - 在 Spring Data REST 中使用嵌套投影

c# - 正则表达式找不到所有匹配项

javascript - 使用Javascript验证10位数字的电话号码

java - 匹配以某个路径元素开头的任何 url