使用 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
需要是String
,y
需要是Integer
或int
,即频率对于那个词。
鉴于此,请多考虑一下您将什么用作参数、您需要进行调用的顺序以及您需要如何操作这些值。例如,如果您已经确定 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);
}
}
}
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
需要是String
,y
需要是Integer
或int
,即频率对于那个词。
鉴于此,请多考虑一下您将什么用作参数、您需要进行调用的顺序以及您需要如何操作这些值。例如,如果您已经确定 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);
}
}
}