要求 1: 输出某个英文文本文件中 26 字母出现的频率, 由高到低排列, 并显示字母出现的百分比, 精确到小数点后面两位.
字母频率 = 这个字母出现的次数 / (所有 A-Z,a-z 字母出现的总数)
如果两个字母出现的频率一样, 那么就按照字典序排列.
要求 2: 输出单个文件中的前 N 个最常出现的英语单词.
作用: 一个用于统计文本文件中的英语单词出现频率的控制台程序;
单词: 以英文字母开头, 由英文字母和字母数字符号组成的字符串视为一个单词. 单词以分隔符分割且不区分大小写. 在输出时, 所有单词都用小写字符表示.
- package dao;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- import java.text.NumberFormat;
- 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 Dao{
- static String str;
- static boolean flag=true;
- static int i;
- static int j;
- static int m;
- static Scanner scan=new Scanner(System.in);
- public static void main(String[] args) {
- System.out.println("运行成功, 请稍等!");
- readFile();
- while(flag) {
- System.out.print("输入 1 查询字母所占的比例, 输入 2 查询占前几个的单词, 输入 3 退出:");
- int n=scan.nextInt();
- switch(n) {
- case 1:
- findletter();// 查询字母所占比例
- break;
- case 2:
- findword();// 查询单词所占的比例
- break;
- case 3:
- System.out.println("退出成功!");
- flag=false;
- break;
- }
- }
- }
- public static void readFile() {
- String pathname = "Harry Potter and the Sorcerer's Stone.txt";
- try (FileReader reader = new FileReader(pathname);
- BufferedReader br = new BufferedReader(reader)
- ) {
- String line;
- while ((line = br.readLine()) != null) {
- str+=line;
- }
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void findletter() {
- char s[]=str.toCharArray();
- int[] a=new int[52];
- char[] b=new char[52];
- String str1="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- b=str1.toCharArray();
- for(j=0;j<str.length();j++) {
- if(s[j]>='a'&&s[j]<='z') {
- m=s[j]-'a';
- a[m]++;
- }
- else if(s[j]>='A'&&s[j]<='Z') {
- m=s[j]-'A'+26;
- a[m]++;
- }
- }
- int t = 0;
- char ts;
- for(i=0;i<52;i++) {
- for(j=i+1;j<52;j++) {
- if(a[i]<a[j]) {
- t=a[i];
- a[i]=a[j];
- a[j]=t;
- ts=b[i];
- b[i]=b[j];
- b[j]=ts;
- }
- }
- }
- double sum=0;
- for(i=0;i<52;i++) {
- sum+=a[i];
- }
- NumberFormat nt = NumberFormat.getPercentInstance();
- nt.setMinimumFractionDigits(2);
- for(i=0;i<52;i++) {
- System.out.println(b[i]+" "+nt.format(a[i]/sum*1.0));
- }
- }
- public static void findword() {
- str.toLowerCase(); // 将 str 转换为小写
- 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+"种单词");
- System.out.println("请输入你要排序前几个单词:");
- Scanner scanner=new Scanner(System.in);
- n=scanner.nextInt();
- for(int i=0;i<n;i++){// 由高到低输出
- System.out.println(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue());
- }
- }
- }
来源: http://www.bubuko.com/infodetail-3281367.html