文件中的 HashMap 字符串出现次数 [JAVA]

HashMap String occurrences in a file [JAVA]

我在我的 Java 课程中学习 HashMaps,我得到了一个任务,将文本文件中的所有单词存储在 HashMap 中,并打印出每个唯一的单词及其出现次数在文件中。

我不知道该怎么做,所以在这里寻求帮助并找到了这个 link:Using HashMap to count instances

我将 Posters 代码改编并使用到我的程序中并且它有效,但我不完全理解为什么并且我不想放弃一些我不明白我自己没有做的事情。

我已经在下面发布了我的完整代码,但有人可以向我解释一下评论部分的功能吗。

   public class Q3HM {
   public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>(50, 10);
                               *****//Not sure what the (50,10) is for

        try {
            File input = new File("input.txt");
            Scanner read = new Scanner(new FileInputStream(input));
            ArrayList<String> list = new ArrayList<>();

            while (read.hasNext()) {
                list.add(read.next());
            }

   *******//Not sure how the below for loop works
            for (String w : list){ 
                Integer i = map.get(w);
                if(i == null){
                    map.put(w, 1);
                }
                else {
                    map.put(w, i+1);
                }
            }
   *******//End of section I'm confused about

            System.out.println(map.toString());
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}
for (String w : list) {
    Integer i = map.get(w);
    if(i == null) {
        map.put(w, 1);
    }
    else {
        map.put(w, i+1);
    }
}

对于列表中的每个字符串,
获取旧值并将其存储为 i.
IF 字符串尚未在映射中(inull),插入 1。(第一次出现)
OTHERWISE,插入 (i + 1)(将当前计数加一。)

更具描述性的重写可以是

for (String word : list) {                 //For every word in list,
    Integer previousAmount = map.get(word);    //Get the current count and store it.
    if(previousAmount == null)             //If the count doesn't exist (null, not in map),
        map.put(word, 1);                  //Put 1 in the map (first time.)
    else                                   //Otherwise (in the map)
        map.put(word, previousAmount + 1); //Add one to the current amount
}

这也可以简单地写成

for(String w : list)
    map.put(w, map.getOrDefault(w, 0) + 1);
for (String w : list){
  Integer i = map.get(w);
  if(i == null){
    map.put(w, 1);
  }
  else {
    map.put(w, i+1);
  }
}

如果字符串(w)在HashMap(map.get(w))中,则在HashMap中引入新的字符串;否则,将(再次)引入字符串并修改计数器 (i+1)

我发现清晰的评论很有帮助。

    // For each word in the list.
    for (String w : list) {
        // Get it's current count from the Map.
        Integer i = map.get(w);
        if (i == null) {
            // Null means never seen before so it's count becomes 1
            map.put(w, 1);
        } else {
            // Seen this word - add one to the count.
            map.put(w, i + 1);
        }
    }