导入文本查询字母单词个数
Posted .HAHA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了导入文本查询字母单词个数相关的知识,希望对你有一定的参考价值。
要求1:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。
字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)
如果两个字母出现的频率一样,那么就按照字典序排列。
字母频率 = 这个字母出现的次数 / (所有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()); } } }
以上是关于导入文本查询字母单词个数的主要内容,如果未能解决你的问题,请参考以下文章
C语言,输入一行英文字母,统计其中有多少个单词,单词之间用空格分隔.
java中,给定一个文本,统计其中的单词个数,要求以单词在文本中出现的先后顺序输出