课上的时候,根据老师的要求。完成了以下几步
1.统计文章中26个英文字母个数及频率
2.统计文章中单词个数,单词出现的频率,按降序排列,并能按照输入的个数,进行指定数量的输出。
代码沿用了之前上学期中统计单词的代码,map作为一个容器 Map<String, Integer> map = new HashMap<String, Integer>();(结合百度的个人理解)
代码中缺少排序,自己的思路是创建数组,存储频率,但是在运行中,出现运行之后没有结果的问题,可能是复杂度太高,或者是代码逻辑存在问题。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package words; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Scanner; public class Words { public static String txtString(File file){ StringBuilder result = new StringBuilder(); try{ BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件 String s = null; while((s = br.readLine())!=null){//使用readLine方法,一次读一行 result.append(s/*+System.lineSeparator()*/); } br.close(); }catch(Exception e){ e.printStackTrace(); } return result.toString(); } public static void findEnglishNum(String text){ //找出所有的单词 String[] array = {".", " ", "?", "!","“"}; for (int i = 0; i < array.length; i++) { text = text.replace(array[i],","); } String[] textArray = text.split(","); //遍历 记录 Map<String, Integer> map = new HashMap<String, Integer>(); double sum=0.00; for (int i = 0; i < textArray.length; i++) { sum++; String key = textArray[i]; //转为小写 String key_l = key.toLowerCase(); if(!"".equals(key_l)){ Integer num = map.get(key_l); if(num == null || num == 0){ map.put(key_l, 1); }else if(num > 0){ map.put(key_l, num+1); } } } //输出到控制台 System.out.println("各个单词出现的频率为:"); Iterator<String> iter = map.keySet().iterator(); String [] a = new String [1000000]; int []b=new int [100000]; while(iter.hasNext()){ int i=0; String key = iter.next(); Integer num = map.get(key); a[i]=key; b[i]=num; i++; System.out.print(key + " " + num + "次"); double n=(num/sum); System.out.println(formatDouble5(n)+"%"); } /*for(int j=0;j<b.length;j++) for(int m=0;m<b.length;m++) { if(b[j]<b[m]) { int q=b[j]; b[j]=b[m]; b[m]=q; String p=a[j]; a[j]=a[m]; a[m]=p; } }*/ } public static String formatDouble5(double d) { return String.format("%.2f", d*100); } public static void main(String[] args){ System.out.println("请输入路径"); Scanner sc=new Scanner(System.in); String a=sc.next(); sc.close(); File file = new File(a); String text =txtString(file); findEnglishNum(text); } }