java实现文件单词频率统计

简介:

思路:  

1、将文件内容存入StringBuffer中。

  2、利用split()函数分割字符串,可按(“,”,“.”,“!”,“空格”,“回车”)分割,得到一个数组。  

3、遍历数组,将其放入一个Map <String,Integer>中,key=单词,value=单词出现的次数。  

4、如要求出文件中出现频率最高的几个单词,则要对Map进行排序。  

-----------------------------------------------------------------------------------------------------------------------------------------

  以下是实现一个文件中出现频率最高的单词的统计   FileWordCount.java主函数所在文件

import  java.io.BufferedReader;
  import  java.io.FileNotFoundException;
  import  java.io.FileReader;
  import  java.io.IOException;
  import  java.util.*;
  
/**
   * Created by IntelliJ IDEA.
   * User: FLY
   * Date: 11-9-13
   * Time: 下午3:59
   * To change this template use File | Settings | File Templates.
   */
  public  class  FileWordCount {
      public  static  void  main(String[] args) {
          try  {
              BufferedReader br = new  BufferedReader( new  FileReader( "D:\\test.txt" ));
              String s;
              StringBuffer sb = new  StringBuffer();
              while  ((s = br.readLine()) != null ) {
                  sb.append(s);
              }
              Map<String,Integer> map = new  HashMap<String, Integer>();
              StringTokenizer st = new  StringTokenizer(sb.toString(), ",.! \n" );
              while  (st.hasMoreTokens()) {
                  String letter = st.nextToken();
                  int  count;
                  if  (map.get(letter) == null ) {
                      count = 1 ;
                  } else  {
                      count = map.get(letter).intValue() + 1 ;
                  }
                  map.put(letter,count);
              }
              Set<WordEntity> set = new  TreeSet<WordEntity>();
              for  (String key : map.keySet()) {
                  set.add( new  WordEntity(key,map.get(key)));
              }
              // 自己拼接字符串,输出我们想要的字符串格式
              System.out.println( "输出形式一:" );
              for  (Iterator<WordEntity> it = set.iterator(); it.hasNext(); ) {
                  WordEntity w = it.next();
                  System.out.println( "单词:"  + w.getKey() + " 出现的次数为: "  + w.getCount());
              }
              // 直接打印 WordEntity 对象,实现我们想要的输出效果,只需在WordEntity类中重写toString()方法
              System.out.println( "输出形式二:" );
              for  (Iterator<WordEntity> it = set.iterator(); it.hasNext(); ) {
                  WordEntity w = it.next();
                  System.out.println(w);
              }
              // 我们可以控制只输出前三名来
              System.out.println( "输出形式三:" );
              int  count = 1 ;
              for  (Iterator<WordEntity> it = set.iterator(); it.hasNext(); ) {
                  WordEntity w = it.next();
                  System.out.println( "第"  + count + "名为单词:"  + w.getKey() + " 出现的次数为: "
                          + w.getCount());
                  if  (count == 3 ) // 当输出3个后跳出循环
                      break ;
                  count++;
              }
          } catch  (FileNotFoundException e) {
              System.out.println( "文件未找到~!" );
          } catch  (IOException e) {
              System.out.println( "文件读异常~!" );
          }
      }
  }
  
  
  
WordEntity.java文件
  
/**
   * Created by IntelliJ IDEA.
   * User: FLY
   * Date: 11-9-13
   * Time: 下午4:57
   * To change this template use File | Settings | File Templates.
   */
  public  class  WordEntity implements  Comparable<WordEntity> {
      private  String key;
      private  Integer count;
      public  WordEntity (String key, Integer count) {
          this .key = key;
          this .count = count;
      }
      public  int  compareTo(WordEntity o) {
          int  cmp = count.intValue() - o.count.intValue();
          return  (cmp == 0  ? key.compareTo(o.key) : -cmp);
          //只需在这儿加一个负号就可以决定是升序还是降序排列  -cmp降序排列,cmp升序排列
          //因为TreeSet会调用WorkForMap的compareTo方法来决定自己的排序
      }
  
     @Override
      public  String toString() {
          return  key + " 出现的次数为:"  + count;
      }
  
     public  String getKey() {
          return  key;
      }
  
     public  Integer getCount() {
          return  count;
      }
  }
  
 
  
  
输出结果:
  
输出形式一:
  单词:is 出现的次数为: 4
  单词:my 出现的次数为: 2
  单词:very 出现的次数为: 2
  单词:word 出现的次数为: 2
  单词:a 出现的次数为: 1
  单词:are 出现的次数为: 1
  单词:boy 出现的次数为: 1
  单词:english 出现的次数为: 1
  单词:fool 出现的次数为: 1
  单词:good 出现的次数为: 1
  单词:hah 出现的次数为: 1
  单词:hello 出现的次数为: 1
  单词:hey 出现的次数为: 1
  单词:i 出现的次数为: 1
  单词:love 出现的次数为: 1
  单词:mary 出现的次数为: 1
  单词:much 出现的次数为: 1
  单词:name 出现的次数为: 1
  单词:ok 出现的次数为: 1
  单词:poor 出现的次数为: 1
  单词:so 出现的次数为: 1
  单词:sophie 出现的次数为: 1
  单词:you 出现的次数为: 1
  输出形式二:
  is 出现的次数为: 4
  my 出现的次数为: 2
  very 出现的次数为: 2
  word 出现的次数为: 2
  a 出现的次数为: 1
  are 出现的次数为: 1
  boy 出现的次数为: 1
  english 出现的次数为: 1
  fool 出现的次数为: 1
  good 出现的次数为: 1
  hah 出现的次数为: 1
  hello 出现的次数为: 1
  hey 出现的次数为: 1
  i 出现的次数为: 1
  love 出现的次数为: 1
  mary 出现的次数为: 1
  much 出现的次数为: 1
  name 出现的次数为: 1
  ok 出现的次数为: 1
  poor 出现的次数为: 1
  so 出现的次数为: 1
  sophie 出现的次数为: 1
  you 出现的次数为: 1
  输出形式三:
  1 名为单词:is 出现的次数为: 4
  2 名为单词:my 出现的次数为: 2
  3 名为单词:very 出现的次数为: 2

  原文地址

方法二

//CountWord.java
  
package  com.xie.tencent;
  
import  java.io.BufferedReader;
  import  java.io.FileInputStream;
  import  java.io.FileNotFoundException;
  import  java.io.IOException;
  import  java.io.InputStreamReader;
  import  java.util.HashMap;
  
/**
   * 这个类用于统计某个单词在所有文件中出现的次数。
   * @author centre
   *
   */
  public  class  CounterWord {
      FileReader fr;
      private  HashMap<String, Integer> hMap= new  HashMap<String, Integer>();;
      
   public  HashMap<String, Integer> gethMap() {
    return  hMap;
   }
   /**
    * 这个构造方法用于持有对方引用
    * @author centre
    * @param f FileReader
    */
   public  CounterWord(FileReader f) {
    fr=f;
   }
   /**
    * 根据传入的文件路径,打开文件,同时分析其中的单词个数,
    * 存放进一个HashMap
    * @author centre
    * @param path String 文件的绝对路径
    * @return 返回值貌似没用,在需要时可以接收
    */
   public  boolean  openFile(String path){
    boolean  b= true ;
    try  {
         FileInputStream fis= new  FileInputStream(path);
         BufferedReader br= new  BufferedReader( new  InputStreamReader(fis));
         try  {
           String words=br.readLine();
           while  (words!= null ) {
            //System.out.println(words);
            String[] word=words.split( "," );
            for  ( int  i = 0 ; i < word.length; i++) {
           addWordCount(word[i]);
       }
            words=br.readLine();
      }
     } catch  (IOException e) {
      System.out.println( "文件读取异常。" );
      e.printStackTrace();
     }
         
    } catch  (FileNotFoundException e) {
     System.out.println( "没有找到该文件:" +path);
     b= false ;
     e.printStackTrace();
    }
    return  b;
   }
   /**
    * 将单词放进map,同时统计单词出现的次数
    * @param word String 单词
    */
   private  void  addWordCount(String word) {
    if  (hMap.containsKey(word)) {
     hMap.put(word, hMap.get(word).intValue()+ 1 );
    } else  {
     hMap.put(word, 1 );
    }
   }

  


本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2013/01/17/2865251.html,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
Java
有关Java发送邮件信息(支持附件、html文件模板发送)
有关Java发送邮件信息(支持附件、html文件模板发送)
31 1
|
1月前
|
Java
java中替换文件内容
java中替换文件内容
14 1
|
1月前
|
Java API
Java中文件与输入输出
Java中文件与输入输出
|
1月前
|
Java
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
10 0
|
1月前
|
Java
java程序导出堆文件
java程序导出堆文件
|
4天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
30 3
|
1月前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
93 3
|
1月前
|
Java
使用java将字符串写入到指定的文件中
使用java将字符串写入到指定的文件中
11 0
|
1月前
|
XML Java 数据格式
使用java解析XML文件的步骤
使用java解析XML文件的步骤
10 0
|
1月前
|
Java
Java文件类
Java文件类
7 0
Java文件类