1.用Reader方法读取文本文件,并抛出异常
public class Main{
public static void main(String[] args)throws Exception{
try(
Reader r=new BufferedReader(new FileReader(abc.txt))
){
2.数据需要容器来存储,建立Collection类
public class Collection{
private CharNumber[] data;//建立数组存储数据
private int pos;
public Collection(){this(10);}//给数组一个初始长度如10
public Collection(int size){data=new CharNumber[size];}
3.定义CharNumber类获取字符出现次数和定义输出格式
public class CharNumber {
private final char cc;
private int num;
public CharNumber(char cc) {
this.cc = cc;
this.num = 1;
}
public int getNum() {
return num;
}
public char getChar() {
return cc;
}
public void addNumber() {
this.num++;
}
public boolean small(CharNumber cn) {
return this.num < cn.num;
}
@Override
public String toString() {
return cc +
"(" + num +
')';
}
}
4.要调用sort必须实现可比较接口并重写相关方法
public class CharNumber implements Comparable<CharNumber> {
private final char cc;
private int num;
@Override
public int compareTo(CharNumber o) {
return o.num-this.num; //如果需要自然序,则this.num-o.num,如果倒序则乘以-1即可
}
public CharNumber(char cc) {
this.cc = cc;
this.num = 1;
}
public int getNum() {
return num;
}
public char getChar() {
return cc;
}
public void addNumber() {
this.num++;
}
public boolean small(CharNumber cn) {
return this.num < cn.num;
}
@Override
public String toString() {
return cc +
"(" + num +
')';
}
}
5.在Collection类中定义实现方法
public void addChar(char cc) {
boolean flag = false;
for (int i = 0; i < pos; i++) {
CharNumber tmp = data[i];
if (cc == tmp.getChar()) {
tmp.addNumber();
flag=true;
break;
}
}
6.在main方法里创建Collection容器并存储内容
Collection arr=new Collection();
while((kk=r.read())!=-1){
arr.addChar((char)kk);
}
7.在Collection类中解决排序和展示的方法
public void sort(){
Arrays.sort(this.data, 0, pos, new Comparator<CharNumber>() {
@Override
public int compare(CharNumber o1, CharNumber o2) {
return o1.getNum()-o2.getNum();
}
});
}
public void show() {
for (int i = 0; i < pos; i++)
System.out.println(data[i] + ",");
}
8.考虑数组扩容的问题
if (!flag) {
data[pos++] = new CharNumber(cc);
//扩容处理
if(pos>=data.length){
int len=data.length+data.length/2;
CharNumber[] newArr=new CharNumber[len];
//使用老旧的方法
System.arraycopy(this.data,0,newArr,0,this.data.length);
this.data=newArr;
}
}
9.最后修改main方法完成实现
ic class Main {
public static void main(String[] args) throws Exception {
//从calcCharNum.txt文件中读取数据,并存储到容器中
try(
Reader r=new BufferedReader(new FileReader("calcCharNum.txt"))
){
int kk=0;
Collection arr=new Collection();
while((kk=r.read())!=-1){
arr.addChar((char)kk);
}
arr.sort();
arr.show();
}
}
}