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,如需转载请自行联系原作者

目录
相关文章
|
2天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
15 4
|
4天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
4天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
14天前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
36 1
|
6天前
|
缓存 Java 程序员
Java|SpringBoot 项目开发时,让 FreeMarker 文件编辑后自动更新
在开发过程中,FreeMarker 文件编辑后,每次都需要重启应用才能看到效果,效率非常低下。通过一些配置后,可以让它们免重启自动更新。
14 0
|
5天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
74 38
|
2天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
6天前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
20 1
[Java]线程生命周期与线程通信
|
3天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
2天前
|
缓存 Java 调度
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文旨在为读者提供一个关于Java多线程编程的全面指南。我们将从多线程的基本概念开始,逐步深入到Java中实现多线程的方法,包括继承Thread类、实现Runnable接口以及使用Executor框架。此外,我们还将探讨多线程编程中的常见问题和最佳实践,帮助读者在实际项目中更好地应用多线程技术。
10 3