我正在尝试使用哈希映射创建一个表,或者使用hasTokens来显示具有相同长度的文件中显示多少个单词的频率。例如,长度为2个字符的单词可能会在整个文本中显示5次。
在.txt文件中,最长的单词是9个字母。如何设置我的代码来分析文件,然后创建一个表格,输出长度为1-9个字符的单词被发现的次数?
我尝试过创建一个for循环,例如:
for(int i= 0; i<word.length(); i++)
{
if (word.length()== 1)
{
System.out.println("The words with length of 1 are: " + i);
}
}
然而它继续无限继续,但当我删除while循环时它失败了。希望有人能够给我一些关于做什么的提示。 谢谢, 杰夫
答案 0 :(得分:0)
您可以使用HashMap,其长度为Key,单词count为value。例如。长度为1-3(未经测试):
List<String> words = Arrays.asList(new String[]{"aaa", "bbb", "x", "y", "rr", "tt"});
Map<Integer, Integer> map = new HashMap<Integer,Integer>();
map.put(1, 0);
map.put(2, 0);
map.put(3, 0);
for(String word: words) {
int cnt = map.get(word.length());
map.put(word.length(), ++cnt);
}
答案 1 :(得分:0)
如果我理解正确,答案就是创建一个整数数组并将其编入索引。这将更快更小:
final static int MIN_WORD_LENGTH=2;
final static int MAX_WORD_LENGTH=9;
int counts[MAX_WORD_LENGTH-MIN_WORD_LENGTH]; // allow for longer words :-)
private void addWord(int length) {
if ((length >=2) && (length < MAX_WORD_LENGTH))
counts[length-MIN_WORD_LENGTH]++;
}
我个人会使用更大的数组并摆脱映射和边界检查。然后我会创建一个更高的异常处理程序,以捕获超出范围的任何内容。像这样: -
int counts[30]; // allow for longer words :-)
private void addWord(int length) throws ArrayIndexOutOfBoundsException{
counts[length]++;
}
在大多数现代处理器上,几个字节的额外存储空间不是问题,您可以在代码大小上节省更多。我也摆脱了函数调用,为了清楚起见,这里是
然后打印:
void printCounts() {
for(int i=0; i < 20; i++) {
if (counts[i] >0)
System.out.printline("There are " + counts[i] + " words of length" + i);
}
}