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

时间:2014-10-09 20:58:02

标签: 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));
        }
    }

}

我试图使用Iterators修改HashMap,但我最终得到了相同的异常。

另外一件事是我在分割文本方面也遇到了问题。在wordArray中,存在空值。这些空值出现在行中的最后一个单词之后,所以我认为这些是\ r \ n白色标志。不幸的是,在split方法中将\ r \ n添加到regex没有任何区别。你能帮忙解决这些问题吗?

提前谢谢!

P.S。这是我关于stackoverflow的第一个问题,对于任何错误都很抱歉:)

3 个答案:

答案 0 :(得分:1)

您正在调用哈希映射的worldMap.put,而迭代(for(String key : worldMap.keySet())正在进行中。密钥集可能会在迭代密钥集时发生变化。这会导致异常。

答案 1 :(得分:0)

问题在于您在wordMap.keySet()上进行迭代,在迭代时,您正在使用wordMap.put向地图添加元素。

您想要做的是:

for(String word : wordArray) {
    Integer count = wordMap.get(word);
    if(count == null) {           // first time for "word" => insert 1
        wordMap.put(word, 1);
    } else {                      // else increment the count
        wordMap.put(word, count + 1);
    }
}

答案 2 :(得分:0)

您的循环代码应更改为此

for(int i=1; i<wordArray.length;i++){
    if(wordMap.containsKey(wordArray[i])){
        wordMap.put(wordArray[i], wordMap.get(wordArray[i])+1);
    } else{
        wordMap.put(wordArray[i], 1);
    }
}

这里我们没有修改地图,但没有循环思考键集。