【问题标题】:Java program - Counts all the words from a text file, and counts frequency of each wordJava程序 - 计算文本文件中的所有单词,并计算每个单词的频率
【发布时间】:2013-10-06 18:14:37
【问题描述】:

我是一名初级程序员,我正在尝试做一个程序,它可以打开一个包含大文本的文本文件,然后计算其中包含多少个单词。 然后它应该写出文本中有多少个不同的单词,并写出每个单词在文本中的频率。 我打算使用一个数组字符串来存储所有唯一的单词,并使用一个整数字符串来存储频率。

程序计算单词,但我有点不确定如何正确编写代码以获取单词列表以及它们在文本中重复的频率。

这是我写的:

import easyIO.*;
import java.util.*;

class Oblig3A{
    public static void main(String[] args){
        int cont = 0;
        In read = new In (alice.txt);
        In read2 = new In (alice.txt);

        while(read.endOfFile() == false)
        {
            String info = read.inWord();
            System.out.println(info);
            cont = cont + 1;
        }

        System.out.println(UniqueWords);

        final int AN_WORDS = cont;

        String[] words = new String[AN_WORDS];
        int[] frequency = new int[AN_WORDS];

        int i = 0;
        while(les2.endOfFile() == false){
           word[i] = read2.inWord();
           i = i + 1;
        }
    }
}

【问题讨论】:

  • 开始使用缩进。这样你的代码会更容易阅读。

标签: java arrays text-files


【解决方案1】:

好的,这是您需要做的:
1. 使用BufferedReader 逐行读取文件中的文本行。
2.创建一个HashMap<String,Integer>来存储词、频关系。
3、阅读每一行文字时,使用split()获取String[]的数组中该行文字的所有单词
4. 遍历每个单词。对于每个单词,从HashTable 中检索值。如果你得到一个空值,你第一次找到了这个词。因此,创建一个值为 1 的新 Integer 并将其放回 HashMap
如果您得到一个非空值,则增加该值并将其放回HashMap
5. 这样做直到你没有达到 EOF。

完成!

【讨论】:

  • HashMap 是正确的想法,但不是BufferedReader 我会使用Scanner(它的nexthasNext 方法更简单)。另外 OP 可能不熟悉 Collection 框架,所以需要 Map 的指向方法来实现这个任务会很好。
  • java.util.Collections中有frequency()方法。这也不能用吗?
  • @EbonyMaw 来自关于 frequency( ) 的文档 此方法返回指定集合中等于指定对象的元素数。 我怀疑 :)
【解决方案2】:

你可以用一个

Map<String, Integer> map = HashMap<String, Integer>();

然后将单词添加到地图中,询问该值是否已经存在。如果不是,请将其添加到地图中,并将计数器初始化为 1。

if(!map.containsKey(word))
{
    map.put(word, new Integer("1"));
}
else
{
    map.put(word, map.get(word) + new Integer(1));
}

最后,您将获得一个包含文件包含的所有单词的地图,以及一个表示该单词在文本中出现多少次的整数。

【讨论】:

    【解决方案3】:

    这里基本上需要一个哈希。在 java 中,您可以使用 HashMap&lt;String, Integer&gt; 来存储单词及其频率。

    所以当你读入一个新词时,在hashMap中查一下,说h,如果存在,增加频率或者添加一个频率=1的新词。

    【讨论】:

      【解决方案4】:

      如果您可以使用库,您可能会考虑使用Guava Multiset,它已经内置了计数功能:

          public void count() throws IOException {
              Multiset<String> countSet = HashMultiset.create();
              BufferedReader bufferedReader = new BufferedReader(new FileReader("alice.txt"));
              String line;
              while ((line = bufferedReader.readLine()) != null) {
                  List<String> words = Arrays.asList(line.split("\\W+"));
                  countSet.addAll(words);
              }
              bufferedReader.close();
              for (Entry<String> entry : countSet.entrySet()) {
                System.out.println("word: " + entry.getElement() + " count: " + entry.getCount());
              }
          }
      

      【讨论】:

        最近更新 更多