JAVA学习之统计一个文件中各个字符出现次数
统计一个文件calcCharNum.txt中各个字符出现次数:A(8),B(16),C(10)...,a(12),b(10),c(3)....,括号内代表字符出现次数,要求按照出现次数从小到达排序输出。如果是回车符则按照空格符处理
先定义属性字符char ch;num为字符出现次数,没出现一次num加一
class CharNum{ private char ch; private int num; public CharNum(char ch){ this.ch=ch; this.num=1; } public void incr() { this.num++; } public char getCh() { return ch; } @Override public String toString() { return ch+"("+num+")"; } public boolean big(CharNum charNum) { boolean res=false; if(this.num>charNum.num) res=true; else if(this.num==charNum.num) res=this.num>charNum.num; return res; } }
将字符存入数组中用字符类CharNum定义数组,由于不确定字符个数需要统计个数的属性count;初始化数组长度为10
class ArrayList{ private CharNum[] arr; private int count; public ArrayList() { this(10); } public ArrayList(int length) { arr=new CharNum[length]; }
数组大小不确定需要数组自增放法
private void resize() { CharNum[] carr=new CharNum[arr.length*2]; for(int i=0;i<count;i++) carr[i]=arr[i]; this.arr=carr; }
搜索文件中的字符,将搜索到的字符的下标位置返回
private int exists(char ch) { int res=-1; for(int i=0;i<count;i++) { CharNum cn=arr[i]; if(cn.getCh()==ch) { res=i; break; } } return res;
得到返回位置后如果字符以及存在字符个数加一,字符不存在添加到数组内,数组自增
public void add(char ch) { int pos=exists(ch); if(pos>0) arr[pos].incr(); else { arr[count++]=new CharNum(ch); if(count>=arr.length) resize(); } }
根据字符的个数从小到大排序
public void sort() { for(int i=1;i<count;i++) { for(int k=0;k<count-i;k++) { if(arr[k].big(arr[k+1])) { CharNum tmp=arr[k]; arr[k]=arr[k+1]; arr[k+1]=tmp; } } } }
展示输出
public void show() { for(int i=0;i<count;i++) System.out.println(arr[i]+","); }
完整代码展示
public class Test2 { //5、统计一个文件calcCharNum.txt中各个字符出现次数:A(8),B(16),C(10)..., //a(12),b(10),c(3)....,括号内代表字符出现次数,要求按照出现次数从小到达排序输出 public static void main(String[] args)throws Exception { ArrayList list=new ArrayList(); try(Reader r=new FileReader("d:/data/in.txt")){ int kk=-1; while(true) { kk=r.read(); if(kk==-1) break; if(kk== ||kk== ||kk== ) kk= ; list.add((char)kk); } list.sort(); list.show(); } } } class CharNum{ private char ch; private int num; public CharNum(char ch){ this.ch=ch; this.num=1; } public void incr() { this.num++; } public char getCh() { return ch; } @Override public String toString() { return ch+"("+num+")"; } public boolean big(CharNum charNum) { boolean res=false; if(this.num>charNum.num) res=true; else if(this.num==charNum.num) res=this.num>charNum.num; return res; } } class ArrayList{ private CharNum[] arr; private int count; public ArrayList() { this(10); } public ArrayList(int length) { arr=new CharNum[length]; } public void add(char ch) { int pos=exists(ch); if(pos>0) arr[pos].incr(); else { arr[count++]=new CharNum(ch); if(count>=arr.length) resize(); } } public void sort() { for(int i=1;i<count;i++) { for(int k=0;k<count-i;k++) { if(arr[k].big(arr[k+1])) { CharNum tmp=arr[k]; arr[k]=arr[k+1]; arr[k+1]=tmp; } } } } public void show() { for(int i=0;i<count;i++) System.out.println(arr[i]+","); } private void resize() { CharNum[] carr=new CharNum[arr.length*2]; for(int i=0;i<count;i++) carr[i]=arr[i]; this.arr=carr; } private int exists(char ch) { int res=-1; for(int i=0;i<count;i++) { CharNum cn=arr[i]; if(cn.getCh()==ch) { res=i; break; } } return res; } }