我在我的高中CS课程中有一项任务,即在一个大文本文件(hamlet或moby dick)中找到15个最常出现的单词。我们需要使用ArrayLists来完成它。经过多次思考后,我仍然感到很难过。我写的方法应该检查列表中的一个单词(在代码中的其他地方生成并包含文本文件中的所有单词)与其他每个单词相对应。如果找到,则添加到计数中。但是,这并不会将计数附加到单词上。到目前为止,这是频率方法:
public static void frequency(ArrayList<String> list){
int count = 0;
for(int i = 0; i < list.size(); i++){
for(int j = 0; j < list.size(); j++){
if(list.get(i).equals(list.get(j))){
count++;
}
}
}
}
答案 0 :(得分:1)
嗯,例如,一个明显的问题可能是你的方法没有返回任何东西,也没有以任何方式更改arraylist(它只使用get()方法)。
方法的第一行是
int count = 0;
然后循环遍历arraylist并使用count ++递增计数,但是你永远不会返回计数。您只需递增计数但它永远不会离开函数,因为它是一个局部变量,它永远不会返回。
进一步表达,第一个&#39; for&#39;例如,循环测试,arraylist的第一个索引与列表中的每个其他索引相对应,并在找到匹配时增加计数。问题是当第一个for循环递增到第二个索引然后将该索引与所有其他索引进行比较时,它会将变量添加到变量&#39; count&#39;更。因此,您的变量计数实际上是单词副本出现在列表中的时间总和。
到目前为止做了很多努力,所以要坚持下去。
答案 1 :(得分:0)
你可以创建2个数组列表,第一个存储单词,第二个存储计数器。
ArrayList<String> listStr;
ArrayList<Integer> listCtr;
让我们说你有以下字符串:&#34;你好SO,Hello World&#34;
<强>算法强>
在listStr上循环以检查单词Hello
是否存在,如果不存在则将其添加到listCtr中。但是,如果找到了该单词,请获取其索引并在listCtr
重复相同的程序,直到你到达EOF(文件结束)。
最后,对arraylist listCtr进行排序(同时确保listStr在排序时也遵循更改)并打印最后15个单词
答案 2 :(得分:0)
我建议使用HashMap<String, Integer>
。
对整个句子进行循环,并为1
中找不到的每个单词添加HashMap
整数HashMap
。否则,根据单词增加HashMap
中的整数。
收集字数统计数据后,使用Collection.sort
方法对HashMap
进行排序:
Collections.sort(entries, new Comparator<Map.Entry<K,V>>() {
@Override
public int compare(Entry<K, V> o1, Entry<K, V> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
然后HashMap
中前15个元素的键是你想要的单词。