A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© student 中级黑马   /  2013-5-23 15:22  /  3502 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 student 于 2013-5-23 15:26 编辑

写了一个小程序,实现的功能如下:

有一个文本文件,文件中有英文单词和中文字符,写一个程序读取该文件中的内容,
然后统计文件中每个英文单词出现的次数,并将统计结果输出到一个文本文件中。


想看详细的分析过程,请看我的博客
http://blog.csdn.net/lancedream/article/details/8944234

代码:
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.util.Iterator;
  8. import java.util.Map;
  9. import java.util.Set;
  10. import java.util.TreeMap;

  11. //文件工具类
  12. class FileUtil {
  13.         private static BufferedReader bufr = null;
  14.         private static BufferedWriter bufw = null;
  15.         // 创建TreeMap集合对象
  16.         private static TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>();

  17.         // 统计英文单词出现的次数:参数in表示需要统计英文单词出现次数的文本文件,out表示将统计的结果输出到的文本文件
  18.         public static void countWordTimes(File in, File out) {
  19.                 // 计数器
  20.                 int count = 0;
  21.                 try {
  22.                         // 创建缓冲输入流对象
  23.                         bufr = new BufferedReader(new FileReader(in));
  24.                         // 字符数组,保存英文单词
  25.                         String[] words = new String[1024];
  26.                         String len = null;
  27.                         // 循环读取文本文件中的内容,一次读取一行数据
  28.                         while ((len = bufr.readLine()) != null) {
  29.                                 // 调用方法,将字符串分割成英文单词,返回这些单词组成的字符串数组
  30.                                 words = englishWors(len);
  31.                                 // 变量字符串数组
  32.                                 for (int i = 0; i < words.length; i++) {
  33.                                         String key = words[i];
  34.                                         // 获取TreeMap对象中的键值
  35.                                         Integer value = treeMap.get(key);
  36.                                         if (!(value == null))
  37.                                                 count = value;
  38.                                         count++;
  39.                                         // 单词作为键,单词出现的次数作为键值,插入到TreeMap集合中
  40.                                         treeMap.put(key, count);
  41.                                         count = 0;// 归零,避免本次键值加到他键的键值上
  42.                                 }
  43.                         }
  44.                 } catch (Exception e) {
  45.                         throw new RuntimeException("缓冲输入流对象失败!");
  46.                 } finally {
  47.                         if (bufr != null) {
  48.                                 try {
  49.                                         bufr.close();// 关闭缓冲输入流对象
  50.                                 } catch (IOException e) {
  51.                                         throw new RuntimeException("关闭缓冲输入流对象失败!");
  52.                                 }
  53.                         }
  54.                 }
  55.                 writeToFile(out, treeMap);
  56.         }

  57.         // 将Map集合中的键值对写入到文件
  58.         public static void writeToFile(File out, TreeMap<String, Integer> treeMap) {
  59.                 try {
  60.                         // 创建缓冲输出流对象
  61.                         bufw = new BufferedWriter(new FileWriter(out));
  62.                         // 将TreeMap集合转换成Set集合,因为Set集合有iterator迭代器
  63.                         Set<Map.Entry<String, Integer>> entrySet = treeMap.entrySet();
  64.                         // 迭代Set集合
  65.                         Iterator<Map.Entry<String, Integer>> it = entrySet.iterator();
  66.                         // 遍历集合
  67.                         while (it.hasNext()) {
  68.                                 Map.Entry<String, Integer> entry = it.next();
  69.                                 // 获取集合中的键
  70.                                 String key = entry.getKey();
  71.                                 // 获取集合中的键值
  72.                                 int value = entry.getValue();
  73.                                 // 将键和键值组成的键值对封装成字符串
  74.                                 String len = new String(key + " = " + Integer.toString(value));
  75.                                 bufw.write(len);// 将字符串len写入到文件中
  76.                                 bufw.newLine();// 换行
  77.                                 bufw.flush();// 刷新缓冲区
  78.                         }
  79.                 } catch (IOException e) {
  80.                         throw new RuntimeException("缓冲输出流对象创建失败!");
  81.                 } finally {
  82.                         if (bufw != null) {
  83.                                 try {
  84.                                         bufw.close();// 关闭缓冲输出流对象
  85.                                 } catch (IOException e) {
  86.                                         throw new RuntimeException("关闭缓冲输出流失败!");
  87.                                 }
  88.                         }
  89.                 }
  90.         }

  91.         // 取出字符串中的英文单词
  92.         public static String[] englishWors(String len) {
  93.                 // 所有字母小写化
  94.                 len = len.toLowerCase();
  95.                 // 匹配非英文字符为空格
  96.                 len = len.replaceAll("[^A-Za-z]", " ");
  97.                 // 将1到多个空格匹配为一个空格
  98.                 len = len.replaceAll("\\s+", " ");
  99.                 // 以空格为分隔符分割字符串,分割结果存入字符串数组中作为单词
  100.                 String[] words = len.split("\\s+");
  101.                 return words;
  102.         }

  103. }

  104. // 主函数
  105. public class WordsCount {
  106.         public static void main(String[] args) throws IOException {

  107.                 // 文件分隔符
  108.                 String separator = File.separator;
  109.                 /*
  110.                  * 将硬盘上的文本文件初始化为文件对象,in是需要读取的文本文件,该文件中有英文单词, 这里采用硬编码,如果没有目录D:\JavaTest
  111.                  * 则需要创建,并且在该目录下新建一个名为 Article.txt 的文本文件,并文件中输入一些英文句子(可以出现中文字符)
  112.                  */
  113.                 File in = new File("D:" + separator + "JavaTest" + separator
  114.                                 + "Article.txt");
  115.                 // 将硬盘上的文本文件初始化为文件对象,out文件用于存储统计的结果
  116.                 File out = new File("D:" + separator + "JavaTest" + separator
  117.                                 + "Result.txt");
  118.                 // 调用统计英文单词次数的方法
  119.                 FileUtil.countWordTimes(in, out);
  120.                 // 用记事本打开文本文件
  121.                 Runtime.getRuntime().exec("notepad " + out + "");
  122.         }
  123. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马