• 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/
    欢迎任何形式的转载,未经作者同意,请保留此段声明!

  • 相关阅读:
    sublimetext ruby 插件
    [C]goto statement, rarely been used. Deprecated???
    [C]union
    [C] Struct Test
    [C,Java,Python]Command Line Argument: argv, argc, sys.argv, args
    [Python]**otherInfo, *other
    [C]parameterized macros 带参数的宏
    [C]指针与结构变量
    [C]结构变量传递给函数
    [C]结构变量数组array of structure varibles
  • 原文地址:https://www.cnblogs.com/linlf03/p/2865251.html
Copyright © 2020-2023  润新知