黑马程序员技术交流社区

标题: 求代码 [打印本页]

作者: 白粥做底    时间: 2015-10-31 23:08
标题: 求代码
把当前文本中的所有文本拷贝,存入一个txt文件,统计每个字符出现的次数
* 并输出,例如   a : 21次   b: 12次.....


作者: ermao_qu    时间: 2015-10-31 23:20
思路:  *                 1,首先明确源文件,和目标文件.这是一个文件拷贝.流选择字符流  *                 2.如何去统计每个字符出现的次数呢?就需要遍历,怎么遍历?每次我们的文本都是一行一行的读取(选用高效率的话),整理字符串,并进行遍历,把遍历的字符和对应的出现次数存入一个map集合.  *                 3.存入map集合的数据,我们需要通过迭代,entrySet或者keySet来进行.这样我们就获取到每个字符出现的次数...  *   *    * 总结:  *                 1.迭代的字符串,应该是一个整体的,不应该分段处理,这样程序就是一个连续.如果分段处理,我们每次调用程序,程序会根据每次调用做出分别处理,这样不会得到我们想要的结果.  *                 2.map记录的value值,也就是次数,需要每次在之前的value基础上递增.而不是依靠外部的一个变量去实现,因为字符出现是没有规则的.比如第一次出现了a,那么计数器增加一次,而第二次出现的是b,计数器还增加1,而此时b才第一次出现. 思考:  *                 根据面向对象的思想,我们知道,每一个功能体,我们要尽量把它独立起来,这样方便我们复用.  *                 都是一些很小的细节问题.但是,却很关键.整体需要一个清晰的思路是必要的.  *   * 源文件---通过IO -----目标文件.  第一个任务完成.  *                                 |------获取字符串---遍历进Map---迭代Map集合---获取对应字符和次数 .   第二任务完成.  * */ public class Demo08 {         public static void main(String[] args) throws IOException {                 File fiReade = new File("c:\\a.txt");                 File fiWrite = new File("c:\\b.txt");                 IORW(fiReade,fiWrite);         }          //1.这是一个将数据分离成字符串,并输出到指定文件的程序.(1)分离字符串,进行后续操作(2)写入文件,完成一个写入文件需求         public  static void IORW(File fiReade, File fiWrite) throws IOException {                 BufferedReader br = new BufferedReader(new FileReader(fiReade));                 BufferedWriter bw = new BufferedWriter(new FileWriter(fiWrite));                 StringBuilder sb  = new StringBuilder();                   String s = null;                 while((s = br.readLine())!= null)                 {                         sb.append(s);  //先装进字符串.等结束后一次性给调用者.                         bw.write(s);                 }                 ergodic(sb.toString());  //这是一个注意.应该所有数据完成之后才可以进行迭代遍历出次数.                 br.close();                 bw.close();                          }          //2.接受分离出来的字符串,然后对字符串进行遍历,并将结果存入map集合.         public static void ergodic(String s) {                 Map<Character,Integer> ma = new HashMap<Character,Integer>();                 char[] ch = s.toCharArray();                                  for(int x = 0; x < ch.length; x ++)                 {                         int num = 1;                         if(!ma.containsKey(ch[x]))                         {                                 ma.put(ch[x], 1);                         } else                         {                                 num =ma.get(ch[x]);  //这是一个应该注意的,此时要记住之前的value值,再此基础上+1                                                                 ma.put(ch[x], ++num);                         }                 }                 ergodicMap(ma);         }                  //3.将map集合进行迭代,         public static void ergodicMap(Map<Character, Integer> ma) {                 Set se = new TreeSet();                 se = ma.entrySet();                 Iterator it = se.iterator();                 while(it.hasNext())                 {                         Entry en = (Entry)it.next();                         System.out.println(en.getKey() + "  : " + en.getValue() + " 次");                 }         } }




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