Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试更新映射键和值时出现ConcurrentModificationException_Java_Regex - Fatal编程技术网

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

Java 尝试更新映射键和值时出现ConcurrentModificationException,java,regex,Java,Regex,我正在尝试编写一个程序(不需要额外的库),它将把一个文本文件作为输入,并将文本中出现的单词映射成精确的出现次数。问题是,当我试图用单词和出现次数填充HashMap时,我陷入了困境。下面您可以找到我正在使用的代码片段: public class App { public static void main(String[] args) { // TODO Auto-generated method stub File file = new File("tex

我正在尝试编写一个程序(不需要额外的库),它将把一个文本文件作为输入,并将文本中出现的单词映射成精确的出现次数。问题是,当我试图用单词和出现次数填充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));
        }
    }

}
公共类应用程序{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
文件=新文件(“text.txt”);
StringBuilder sb=新的StringBuilder();
try(BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(file))){
字符串内容=br.readLine();
while(内容!=null){
附加(内容);
sb.append(System.lineSeparator());
content=br.readLine();
}
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE1异常){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
字符串text=sb.toString();
String[]wordArray=text.split(“\\s|\.\\s|\,\\s|\\r\\n”);
System.out.println(wordArray.length);
LinkedHashMap wordMap=新建LinkedHashMap();
put(wordArray[0],1);

for(int i=1;i您正在调用修改哈希映射的
worldMap.put
,而(String key:worldMap.keySet())的迭代(
)正在进行中。
在对键集进行迭代时,键集可能会更改。这会导致异常。

问题是您在
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);
    }
}

循环代码应该更改为

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);
    }
}

for(inti=1;我希望你能给出一个完美的答案。你提出了更好的方法。谢谢你错误的答案:)现在可以了。