需求: 有一个文件a.txt, 比如有''aa bb cc dd ef ghab"等多行字符,
如何统计每个字符出现的次数? 并把统计结果保存到文件b.txt 中 ?
/**
* 统计: 文件的字符数----->按数量升序排列
*
* @author wang
*
* 思路: 输入流/输出流 --->读文件为char -->存入TreeMap: (char,int),统计字符数
* TreeMap 中传入比较器, 使其 (按条件) 排序
* 写入排序后的结果: 到新的文件
*/
public class SortFileCount {
public static void main(String[] args) throws Exception {
//输入流/输出流 --->读文件为char,统计数量 -->存入TreeMap:
FileReader r = new FileReader("a.txt");
FileWriter w = new FileWriter("b.txt");
int res=0;//准备容器: 写入统计数据
TreeMap<Character,Integer> map = new TreeMap<>();
while((res=r.read())!=-1) {
if(map.containsKey((char)res)) {
map.put((char)res, map.get((char)res) +1);
}else {
map.put((char)res, 1);
}
}
// TreeMap 中传入比较器, 使其 (按条件) 排序
TreeSet<Entry<Character,Integer>> set=new TreeSet<> (new Comparator<Entry<Character,Integer>>() {
@Override
public int compare(Entry<Character, Integer> o1, Entry<Character, Integer> o2) {
//排序: key--字符,val---数量: 先比数量-->再比字符
int x= -(o1.getValue()-o2.getValue());//数量:降序
int y=o1.getKey()-o2.getKey();//字符: 升序
int z=( x==0 ? y :x) ;
return z;
}
});
set.addAll(map.entrySet());//添加内容: 使其排序
//将内容:写入文件保存
for(Entry<Character,Integer> en: set) {
if(en.getKey()=='\r' | en.getKey()=='\n') {
w.write("换行符,"+en.getValue());
}
else {
w.write(en.getKey()+","+en.getValue());
}
w.write("\r\n");
}
//资源关闭
r.close();
w.close();
}
}
效果截图: