• 《软件工程》个人作业5----单词统计


    1.要求:

        用户需求:

        英语的26 个字母的频率在一本小说中是如何分布的?

        某类型文章中常出现的单词是什么?

        某作家最常用的词汇是什么?

        《哈利波特》 中最常用的短语是什么,等等。

        我们就写一些程序来解决这个问题,满足一下我们的好奇心。

        第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。字母频率 = 这个字母出现的次数 / (所有A-Z,az字母出现的总数)如果两个字母出现的频率一样,那么就按照字典序排列。  如果 S 和 T 出现频率都是 10.21%, 那么, S 要排在T 的前面。

        第1步:输出单个文件中的前 N 个最常出现的英语单词。作用:一个用于统计文本文件中的英语单词出现频率。单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。英文字母:A-Z,a-z字母数字符号:A-Z,a-z,0-9

        第2步:输出单个文件中的前 N 个最常出现的英语单词。分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。good,Good和GOOD是同一个单词。

    2.截图:

     

    3.代码

    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());
            }    
        }
    }
  • 相关阅读:
    GIS Cesium地图数据配置
    HDFS详解
    Hadoop学习路线图
    SecureCRT工具
    Eclipse使用技巧收集
    如何确定 Hadoop map和reduce的个数--map和reduce数量之间的关系是什么?
    HBase基本概念
    Hbase Rowkey设计
    MapReduce调度与执行原理系列文章
    LVS学习笔记及总结(思维导图版)
  • 原文地址:https://www.cnblogs.com/wind-and-sky/p/13089557.html
Copyright © 2020-2023  润新知