使用HashMaps的字数统计程序

时间:2015-10-20 18:47:11

标签: java algorithm hashmap counting

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

我正在尝试编写一个程序来输入/扫描文件,在HashMap集合中记录单词,并计算单词在文档中出现的次数,只计算超过5个字符的单词。

中间有点乱,但我遇到了如何计算单词出现次数以及保持每个单词的个别计数的问题。我确信这里有一个简单的解决方案,我只是错过了它。请帮忙!

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

(仅提供提示,因为这似乎是作业。)my_collection(正确)HashMapString键映射到Integer值;在你的情况下,一个键应该是一个单词,相应的值应该是你看到那个单词(频率)的次数。每次拨打my_collection.get(x)时,参数x都必须是String,即您想知道其频率的字词(不幸的是,HashMap并未强制执行这个)。每次拨打my_collection.put(x, y)时,x都需要String,而y需要是Integerint,即频率为了这个词。

鉴于此,请更多地考虑您作为参数使用的内容,以及需要进行调用的顺序以及操作值的方式。例如,如果您已经确定my_collection没有包含该字词,那么问my_collection这个字的频率是否有意义?如果它确实包含该单词,那么在将新值放入my_collection之前,如何更改频率?

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

答案 2 :(得分:0)

尝试这种方式 -

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

                }
}