单词统计1——字母频率、单词频率

课上的时候,根据老师的要求。完成了以下几步

1.统计文章中26个英文字母个数及频率

2.统计文章中单词个数,单词出现的频率,按降序排列,并能按照输入的个数,进行指定数量的输出。

代码沿用了之前上学期中统计单词的代码,map作为一个容器 Map<String, Integer> map = new HashMap<String, Integer>();(结合百度的个人理解)

代码中缺少排序,自己的思路是创建数组,存储频率,但是在运行中,出现运行之后没有结果的问题,可能是复杂度太高,或者是代码逻辑存在问题。

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);
        }

}
View Code
原文地址:https://www.cnblogs.com/lixv2018/p/11057352.html