2011-03-10 51 views
4

我有一个目录,其中有1000个txt.files。我想知道每个单词在1000文档中出现的次数。所以,即使在X中出现100次“奶牛”这个词,它仍然会被视为一个。如果它发生在不同的文档中,则会增加1。因此,如果每个文档中出现“cow”,最大值为1000。如何在不使用任何其他外部库的情况下轻松完成此操作。这里是我到目前为止文档中的字数频率

 private Hashtable<String, Integer> getAllWordCount() 
    private Hashtable<String, Integer> getAllWordCount() 
    { 
     Hashtable<String, Integer> result = new Hashtable<String, Integer>(); 
     HashSet<String> words = new HashSet<String>(); 
     try { 
      for (int j = 0; j < fileDirectory.length; j++){ 
       File theDirectory = new File(fileDirectory[j]); 
       File[] children = theDirectory.listFiles(); 

       for (int i = 0; i < children.length; i++){ 
        Scanner scanner = new Scanner(new FileReader(children[i])); 

        while (scanner.hasNext()){ 
String text = scanner.next().replaceAll("[^A-Za-z0-9]", ""); 
         if (words.contains(text) == false){ 
          if (result.get(text) == null) 
           result.put(text, 1); 
          else 
           result.put(text, result.get(text) + 1); 
          words.add(text); 
         } 
        } 
       } 
       words.clear(); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println(result.size()); 
     return result; 
    } 

回答

2

您还需要在其中存储每个独特字你从当前文件中读取一个HashSet<String>

然后,在读完每个单词后,您应该检查它是否在集合中,如果不是,则递增result映射中的相应值(或者添加一个新条目(如果它是空的,就像您已经这样做了))和将单词添加到集合中。

不要忘了在开始阅读新文件时重置该设置。

+0

好吧,这样两次迭代是必要的?没有办法做到一枪?有没有办法直接读取整个txt文件作为字符串,所以我不必逐行阅读 – aherlambang 2011-03-10 00:30:13

+0

ÁEquinoX不,只需要一次迭代,但您检查/更新每个单词的两个集合。 – biziclop 2011-03-10 00:37:33

+0

我认为你误解了我的问题......我不想在开始一个新文件时重置整个集合,因为之前的集合中的前几个字词可能出现在下一个文件 – aherlambang 2011-03-10 00:38:12

0

这个怎么样?

private Hashtable<String, Integer> getAllWordCount() 
{ 
    Hashtable<String, Integer> result = new Hashtable<String, Integer>(); 
    HashSet<String> words = new HashSet<String>(); 
    try { 
     for (int j = 0; j < fileDirectory.length; j++){ 
      File theDirectory = new File(fileDirectory[j]); 
      File[] children = theDirectory.listFiles(); 
      for (int i = 0; i < children.length; i++){ 
       Scanner scanner = new Scanner(new FileReader(children[i])); 
       while (scanner.hasNext()){ 
        String text = scanner.next().replaceAll("[^A-Za-z0-9]", ""); 
        words.add(text); 
       } 
       for (String word : words) { 
        Integer count = result.get(word) 
        if (result.get(word) == null) { 
        result.put(word, 1); 
        } else { 
        result.put(word, result.get(word) + 1); 
        } 
       } 
       words.clear(); 
      } 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println(result.size()); 
    return result; 
}