zoukankan      html  css  js  c++  java
  • 单词统计

    一、题目要求

      《哈利波特》 中最常用的短语是什么,等等。我们就写一些程序来解决这个问题,满足一下我们的好奇心。第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。字母频率 = 这个字母出现的次数 / (所有A-Za-z字母出现的总数)。如果两个字母出现的频率一样,那么就按照字典序排列。  如果 S  T 出现频率都是 10.21%, 那么, S 要排在的前面。第1步:输出单个文件中的前 N 个最常出现的英语单词。作用:一个用于统计文本文件中的英语单词出现频率。单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。英文字母:A-Za-z字母数字符号:A-Za-z0-9。第1步:输出单个文件中的前 N 个最常出现的英语单词。分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。goodGoodGOOD是同一个单词。

    二、代码

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

    三、运行结果

     

     

  • 相关阅读:
    AngularJS-webapp($q)
    mybatis
    maven联通网络下中央仓库不能访问的解决办法
    IDEA闪退问题
    scala学习笔记(8)文件和正则表达式
    scala学习笔记(8)
    scala学习笔记(7)
    kafka复习(2)
    第一天
    while循环
  • 原文地址:https://www.cnblogs.com/2940500426yingxin/p/13094738.html
Copyright © 2011-2022 走看看