黑马程序员技术交流社区

标题: 如何统计一个.txt文件中每个字符出现的次数? [打印本页]

作者: 胡志翔    时间: 2013-11-5 23:44
标题: 如何统计一个.txt文件中每个字符出现的次数?
本帖最后由 胡志翔 于 2013-11-6 10:23 编辑

如何统计一个.txt文件中每个字符出现的次数?
作者: doitforyou    时间: 2013-11-6 00:24
时间原因,我就实现了最基本功能,但是运行了没有问题。
对异常直接抛出了,TreeMap也没有构造比较器,凑合着看吧,思路还是很清晰的。
重要的是领会思路。不多说了,代码奉上,抛砖引玉吧。
  1. /*
  2. 大致思路:
  3. 1.使用IO流与文件关联,为了提高效率和使用readLine方法,此时使用了包装设计模式
  4. 2.对每次读到的line使用Map键值对进行存储和计数。
  5. 3.关闭资源
  6. */
  7.         //计数方法:
  8.         public static void countChar()throws Exception
  9.         {
  10.                 //1.关联要读取的文件
  11.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("MapSpread.java")));
  12.                 //2、定义存储的map集合,使用的是默认排序
  13.                 TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
  14.                 String line = null;
  15.                 int count = 1;
  16.                 //3。此处最为关键,循环读写文件并存进map然后计数
  17.                 while((line=bufr.readLine())!=null)
  18.                 {
  19.                         for (int i=0; i<line.length(); i++)
  20.                         {
  21.                                 Character key = line.charAt(i);
  22.                                 if(!tm.containsKey(key))
  23.                                         tm.put(key,count);
  24.                                 else
  25.                                         tm.put(key,tm.get(key)+1);
  26.                                 count = 1;
  27.                         }
  28.                 }
  29.                 //4。关闭资源:
  30.                 bufr.close();
  31.                 //5。调用方法打印字符个数:
  32.                 printMap(tm);
  33.         }

  34.         //打印map集合
  35.         public static void printMap(Map<Character,Integer> map)
  36.         {
  37.                 Set<Map.Entry<Character,Integer>> entrySet = map.entrySet();

  38.                 for (Iterator<Map.Entry<Character,Integer>> it=entrySet.iterator(); it.hasNext(); )
  39.                 {
  40.                         Map.Entry<Character,Integer> me = it.next();
  41.                         Character key = me.getKey();
  42.                         int countValue = me.getValue();
  43.                         System.out.print(key+"("+countValue+")\t");
  44.                 }
  45.         }
复制代码

作者: 王东    时间: 2013-11-6 00:43
  1. package com.itheima;

  2. import java.io.*;
  3. import java.util.*;


  4. /*@问题 统计.txt中每个字符出现的次数
  5. *@author 王东
  6. *
  7. * */
  8. public class CharDemo {

  9.         public static void main(String[] args) throws IOException{
  10.                 FileReader fr  = new FileReader("java.txt");
  11.                
  12.                 TreeMap<Character , Integer> tm = new TreeMap<Character , Integer>();
  13.                 int by = 0;
  14.                 int count = 0;
  15.                
  16.                 while((by = fr.read()) != -1){
  17.                         if(by == '\r' || by == '\n')
  18.                                 continue;
  19.                        
  20.                         Integer value = tm.get((char)by);
  21.                        
  22.                         if(value != null)
  23.                                 count = value;
  24.                         count++;
  25.                         tm.put((char)by , count);
  26.                 }
  27.                
  28.                 fr.close();
  29.                
  30.                
  31.                 System.out.println(tm);
  32.         }

  33. }
复制代码

作者: doitforyou    时间: 2013-11-6 00:54
王东 发表于 2013-11-6 00:43

代码有个小瑕疵,是关于计数的变量count,每次读取后都要复位为0,它是共享的。
我用了你的代码,计数不对,一直累加。

作者: 王东    时间: 2013-11-6 01:22
doitforyou 发表于 2013-11-6 00:54
代码有个小瑕疵,是关于计数的变量count,每次读取后都要复位为0,它是共享的。
我用了你的代码,计数不 ...

哦哦,的确是,没看仔细,谢谢你啊, 把                     
                        if(value != null)
                              count = value;
                        count++;
                        tm.put((char)by , count);

改成
  1.                         if(value != null){
  2.                                 count = value;
  3.                                 count++;
  4.                                 tm.put((char)by , count);
  5.                         }else{
  6.                                 tm.put((char)by , 1);
  7.                         }
复制代码
就行了,谢谢大牛指导。
作者: 王靖远    时间: 2013-11-6 01:25
代码不上了。说下思路吧。随便用一个字符流给文件中字符串全读出来,然后转成字符数组,然后遍历数组去统计吧。
作者: 黄炳期    时间: 2013-11-6 08:45
帖子已重新分类,若仍有疑惑,可继续提问




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2