实现计算文件中字符的占比和不同单词的个数两项功能,首先将文本文件按行导入到程序中,再通过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()+" ");
}
} }

  结果截图:

文本harry potter的字符统计的更多相关文章

  1. XML中文本节点存储任意字符的方法

    XML xml是一种可扩展标签语言, 为众多浏览器支持解析, ajax更是利用xml来完成服务器和客户端之前的通信. xml基本元素为 <label>xxx</label>, ...

  2. ytu 1910:字符统计(水题)

    字符统计 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 92[Submit][Status][Web Board] Descri ...

  3. PAT-乙级-1042. 字符统计(20)

    1042. 字符统计(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 请编写程序,找出一段给定文字中出现最 ...

  4. PAT 乙级 1042 字符统计(20) C++版

    1042. 字符统计(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 请编写程序,找出一段给定文字中出现最 ...

  5. PAT 1042 字符统计(20)(思路)

    1042 字符统计(20)(20 分) 请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过1000的字符串.字符串由ASCII码表中任意可见字符及空格 ...

  6. 【算法笔记】B1042 字符统计

    1042 字符统计 (20 分) 请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串.字符串由 ASCII 码表中任意可见字符及空 ...

  7. 3218: 字符串字符统计—C语言

    3218: 字符串字符统计—C语言 时间限制: 1 Sec  内存限制: 128 MB提交: 270  解决: 129[提交][状态][讨论版][命题人:smallgyy] 题目描述 编写一函数,由实 ...

  8. PAT(B) 1042 字符统计(Java)字符串 正则表达式 统计

    题目链接:1042 字符统计 (20 point(s)) 题目描述 请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式 输入在一行中给出一个长度不超过 1000 的字符串.字符串由 A ...

  9. P1042 字符统计

    P1042 字符统计 转跳点:

随机推荐

  1. C# MemoryCache学习笔记

    很多情况下需要用到缓存,合理利用缓存一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.为了避免每次请求都去访问后台的 资源(例如数据库),一般会考虑将一些更新不是很频繁的.可以重用的数据 ...

  2. C#设计模式学习笔记:(13)模板方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7837716.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第一个模式--模 ...

  3. MS14-068提权和impacket工具包提权

    ms14-068提权 工具利用 a)拿下边界机win7,并已经有win7上任意一个账号的密码 -u 用户名@域 -p 用户密码 -s 用户sid -d 域控 ms14-068.exe -u test3 ...

  4. SAP 事务代码 ME31K 报错 - 不含来自带工厂分配的供应商的物料的采购没有被定义 -

    SAP 事务代码 ME31K 报错 - 不含来自带工厂分配的供应商的物料的采购没有被定义 - 近日收到业务团队的报错说,试图创建合同,报错如下: 不含来自带工厂分配的供应商的物料的采购没有被定义 这个 ...

  5. 【转载】sql-builder介绍

    原文链接:sql-builder介绍 关于sql-builder sql-builder尝试使用java对象,通过类SQL的拼接方式,动态快速的生成SQL.它可作为稍后的开源项目ibit-mybati ...

  6. clr via c# 接口

    1,常用接口及其定义 public interface IDisposable{ void Dispose(); } public interface IEnumerable}{ IEnumerato ...

  7. ts中的装饰器

    // 装饰器一种特殊的类的声明, 扩展类.属性.方法. function logClass(params:any) { console.log(params); // params代表HttpClic ...

  8. JS简易计算器的实现,以及代码的优化

    用JS实现简易计算器 首先创建结构和样式 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  9. 使用VConsole调试代码

    在真实手机上运行H5页面时,无法看到控制台.为了能在真实手机上使用控制台,可以加入如下代码实现控制台: //引入vconsole var isTestEnvironment =true if(isTe ...

  10. idea中MavenWeb项目不能创建Servlet的解决办法

    问题 学习完maven后,用maven创建了一个web项目,然后在这个web项目中创建了一个java文件夹并标记这个目录为源码根目录,当我准备创建一个Servlet的时候发现没有,如下图 解决办法 1 ...