使用 HashMap 的字数统计程序

Word Count Program using HashMaps

import java.io.*;
import java.util.*;

public class ListSetMap2 
{
    public static void main(String[] args)
    {
        Map<String, Integer> my_collection = new HashMap<String, Integer>();
        Scanner keyboard = new Scanner(System.in);

        System.out.println("Enter a file name");
        String filenameString = keyboard.nextLine();
        File filename = new File(filenameString);
        int word_position = 1;
        int word_num = 1;

        try
        {
            Scanner data_store = new Scanner(filename);
            System.out.println("Opening " + filenameString);
            while(data_store.hasNext())
            {
                String word = data_store.next();
                if(word.length() > 5)
                {
                    if(my_collection.containsKey(word))
                    {
                        my_collection.get(my_collection.containsKey(word));
                        Integer p = (Integer) my_collection.get(word_num++);
                        my_collection.put(word, p);
                    }
                    else
                    {
                        Integer i = (Integer) my_collection.get(word_num);
                        my_collection.put(word, i);
                    }
                }
            }
        }
        catch (FileNotFoundException e)
        {
            System.out.println("Nope!");
        }
    }
}

我正在尝试编写一个程序,其中 inputs/scans 一个文件,将单词记录在 HashMap 集合中,并计算该单词在文档中出现的次数,只计算超过 5 个字符的单词.

中间有点乱,但我 运行 正在研究如何计算单词出现的次数,以及如何对每个单词进行单独计数。我确定这里有一个简单的解决方案,我只是想念它。请帮忙!

(仅给出提示,因为这似乎是家庭作业。)my_collection 是(正确地)将 String 键映射到 Integer 值的 HashMap;在您的情况下,键应该是一个词,相应的值应该是您看到该词的次数(频率)。每次你调用 my_collection.get(x) 时,参数 x 需要是一个 String,即你想知道其频率的词(不幸的是,HashMap 不强制执行此操作) .每次调用my_collection.put(x, y)x需要是Stringy需要是Integerint,即频率对于那个词。

鉴于此,请多考虑一下您将什么用作参数、您需要进行调用的顺序以及您需要如何操作这些值。例如,如果您已经确定 my_collection 不包含该词,那么向 my_collection 询问该词的频率是否有意义?如果它确实包含单词,那么在将新值放入 my_collection 之前,您需要如何更改频率?

(另外,请为 my_collection 选择一个更具描述性的名称,例如 frequencies。)

你设置词频的逻辑是错误的。这是一个适合您的简单方法:

    // if the word is already present in the hashmap
    if (my_collection.containsKey(word)) {
        // just increment the current frequency of the word
        // this overrides the existing frequency
        my_collection.put(word, my_collection.get(word) + 1);
    } else {
        // since the word is not there just put it with a frequency 1
        my_collection.put(word, 1);
    }

试试这个方法 -

while(data_store.hasNext()) {

                String word = data_store.next();

                   if(word.length() > 5){

                    if(my_collection.get(word)==null) my_collection.put(1);
                    else{
                       my_collection.put(my_collection.get(word)+1);
                    }

                }
}