思路: * 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() + " 次"); } } } |