实现计算文件中字符的占比和不同单词的个数两项功能,首先将文本文件按行导入到程序中,再通过charAT()函数来实现对单个字符的操作,并用集合来统计字符总数以及不同的字符的个数,进而输出各个字符的个数以及占总数的百分比。计算单词个数时通过判断是否是非单词字符来实现,并使用sort()函数来实现升序操作。通过循环输出单词及其个数。

package All;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class all {
public static void main(String[] args)throws IOException//扔掉很重要
{
File file = new File("f.txt");
System.out.println("1.统计英文单词个数"+" "+"2.统计字母个数");
Scanner sc = new Scanner(System.in);
int value=sc.nextInt(); switch(value) { case 1:txtString2(file);
break;
case 2:txtString(file);break; }
} /*
* 统计字母
*/
public static void txtString(File file) throws IOException{
try {
//IO操作读取文件内容
FileReader fr = new FileReader(file);
@SuppressWarnings("resource")
BufferedReader br = new BufferedReader(fr);//构造一个BufferedReader类来读取文件
HashMap<String,Integer> hm = new HashMap<>();//构建了一个新的HashMap对象,强制指定这个HashMap必须是以String为key, 以Integer为值。
String line =null;
Integer count = 0;//每个字母的个数
Integer total = 0;//统计字母总数,作百分比用
char ch;
while ((line=br.readLine())!=null) {
for(int j=0;j<line.length();j++) {
ch=line.charAt(j);
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {//将字符串对象中的字符转换为一个字符数组。
total = total + 1; count=hm.get(ch+"");
if(count==null) {
count=1;
}
else {
count++;
}
hm.put(ch+"",count);
}
}
}
/* for (String str : hm.keySet()) {//设变量str获取键
lv=list.get(list.size()-i-1).getValue()*1.0/total*100;
System.out.println(str+"个数:"+hm.get(str)+" "+String.format("%.2f", lv)+"%");
}*/
System.out.println("总字母个数:"+total); List<Map.Entry<String ,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(hm.entrySet());
//在java中,如果要对集合对象或数组对象进行排序,需要实现Comparator接口以达到我们想要的目标
Comparator<Map.Entry<String,Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) {
return (left.getValue().compareTo(right.getValue()));
}
};
// 集合默认升序升序
Collections.sort(list,comparator);
double lv=0;
for(int i=0;i<52;i++){// 由高到低输出
lv=list.get(list.size()-i-1).getValue()*1.0/total*100;
System.out.println(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue()+" "+String.format("%.2f", lv)+"%");
} } catch (FileNotFoundException e) {
e.printStackTrace();
}
} /*
* 统计单词
*/
public static void txtString2(File file) throws IOException{
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);//构造一个BufferedReader类来读取文件
StringBuffer sb = new StringBuffer();
String line =null;
while ((line=br.readLine())!=null){
sb.append(line);//将读取出的字符追加到stringbuffer中
}
fr.close();
// 关闭读入流
String str = sb.toString().toLowerCase(); // 将stringBuffer转为字符并转换为小写
String[] words = str.split("[^(a-zA-Z)]+"); // 非单词的字符来分割,得到所有单词
Map<String ,Integer> map = new HashMap<String, Integer>() ;
for(String word :words){
if(map.get(word)==null){ // 若不存在说明是第一次,则加入到map,出现次数为1
map.put(word,1);
}else{
map.put(word,map.get(word)+1); // 若存在,次数累加1
}
}
// 排序
List<Map.Entry<String ,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
Comparator<Map.Entry<String,Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) {
int i=left.getValue()-right.getValue();
if(i==0) {
return (right.getKey().compareTo(left.getKey()));
}
return (left.getValue().compareTo(right.getValue()));
}
}; // 集合默认升序
Collections.sort(list,comparator);
int n=list.size(); System.out.println("一共有"+n+"个单词"); for(int i=0;i<n;i++){// 由高到低输出
System.out.print(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue()+" ");
}
} }

  结果截图:

最新文章

  1. 用grunt搭建web前端开发环境
  2. JavaScript学习笔记-正则表达式(语法篇)
  3. 5.1 stack,queue以及priority_queue
  4. 18SpringMvc_在业务控制方法中收集数组参数
  5. inner join、left join、right join等的区别
  6. IOS学习之路- 运行过程
  7. 笨办法学 Python (第三版)(转载)
  8. Python 一等函数
  9. Cleaner, more elegant, and harder to recognize(翻译)
  10. 日志学习系列(四)——NLog实例
  11. OpenCV__cv::Mat::step
  12. ERROR 1698 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39;
  13. vuex中store保存的数据,刷新页面会清空
  14. [PHP] 算法-将一个字符串转换成一个整数的PHP实现
  15. ping百度域名时的收获
  16. HttpURLConnection与HttpClient浅析
  17. PHP7.0新特性
  18. MySQL 加锁处理分析 ---非常牛逼
  19. zoj2112&amp;&amp;bzoj1901
  20. 搭建Hive 2.1.1 基于Hadoop 2.6.1 和 Ubuntu 16.0.4 记录

热门文章

  1. Python学习小记(5)---Magic Method
  2. javascript30--day01--Drum kit
  3. Android Studio安装虚拟机步骤
  4. phpstrom laravel代码自动提示
  5. JDK SPI 机制
  6. css如何玩转有序无序列表项list样式
  7. 链接github
  8. nuget打包上传
  9. #《H.264和MPEG-4视频压缩》# 一. 色彩空间
  10. win10下GO的环境配置