• 单词统计


    这个程序解决的问题是:在一个文本文件中放入一个文章,我们放入的文章是《飘》

     第0步:输出文本文件中26个英文单词出现的频率,由高到低排列,并显示字母出现的出现的百分比,精确到小数点后面两位。要求:

    字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)

    如果两个字母出现的频率一样,那么就按照字典序排列。  如果 S 和 T 出现频率都是 10.21%, 那么, S 要排在T 的前面。

    这个部分的代码为:

    package piao;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.text.NumberFormat;
    
    public class piao1{
        
         private static String formattedDecimalToPercentage(double d)
            {
                //获取格式化对象
                NumberFormat n = NumberFormat.getPercentInstance();
                //设置百分数精确度2即保留两位小数
                n.setMinimumFractionDigits(2);
                return nt.format(decimal);
            }
    
    public static void main(String []args) {
        String aa;
        char a='A';
        int b[]=new int[27];
        char c[]=new char[26];
        char d[]=new char[26];
        
        for(int i=0;i<26;i++)
        {
        c[i]=a;
        d[i]=(char)(a+32);
        a++;
        }
        
        /*for(int i=0;i<26;i++) {
            
            System.out.println(b1[i]);
            System.out.println(b2[i]);
        }*/
        
        try {
            BufferedReader in = new BufferedReader(new FileReader("D:\飘.txt"));
            String s;
            while ((s= in.readLine()) != null) {
               // System.out.println(str);
                char[] d=s.toCharArray();
                for(int i=0;i<d.length-1;i++) {
                    for(int j=0;j<26;j++) {
                        if(c[j]==dd[i]||d[j]==dd[i]) {
                            b[j]++;
                        }
                    }
                }
            }
            
            b[26]=0;
            for(int i=0;i<26;i++) {
                b[26]=b[i]+b[26];
            }
    
            for(int i=0;i<26;i++) {
                System.out.print(c[i]);
                System.out.print("和");
                System.out.print(c[i]);
                System.out.print("出现的次数为:");
                System.out.println(b[i]);
                double dd=(double)((double)b[i]/(double)b[26]);
                String r2=formattedDecimalToPercentage(dd);
                System.out.println("result = "+r2);
    
            }
     
        } catch (IOException e) {
        }
        }
    }

    首先要设置精确到小数点后两位,然后要设置数组,读取文件。

    第一步是:输出单个文件中的前 N 个最常出现的英语单词。一个用于统计文本文件中的英语单词出现频率。

    要求:

    以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。

    英文字母:A-Z,a-z

    字母数字符号:A-Z,a-z,0-9

    代码为:

    package piao;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Map;
    import java.util.Scanner;
    import java.util.TreeMap;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class piao { 
                public static void main(String[] args) throws Exception {
                    BufferedReader reader = new BufferedReader(new FileReader(
                            "D:\飘.txt"));
                    StringBuffer buffer = new StringBuffer();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        buffer.append(line);
                    }
                    reader.close();
                    Pattern expression = Pattern.compile("[a-zA-Z]+");// 定义正则表达式匹配单词
                    String string = buffer.toString();
                    Matcher matcher = expression.matcher(string);//
                    Map<String, Integer> map = new TreeMap<String, Integer>();
                    String w = "";
                    int t= 0;
    
    
      while (matcher.find()) {// 是否匹配单词
                        w= matcher.group();// 得到一个单词-树映射的键
                        if (map.containsKey(w)) {// 如果包含该键,单词出现过
                            t= map.get(w);// 得到单词出现的次数
                            map.put(w, t+ 1);
                        } else {
                            map.put(w, 1);// 否则单词第一次出现,添加到映射中
                        }
                    }
                    /*
                     * 核心:如何按照TreeMap 的value排序而不是key排序.将Map.Entry放在集合里, 重写比较器,在用
                     * Collections.sort(list, comparator);进行 排序
                     */
             
                    List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(
                            map.entrySet());
                    /*
                     * 重写比较器
                     * 取出单词个数(value)比较
                     */
                    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) {
                            return (left.getValue()).compareTo(right.getValue());
                        }
                    };
                    Collections.sort(list, comparator);// 排序
                    System.out.println("请输入要输出的单词个数:");
                    Scanner s=new Scanner(System.in);
                    int n=s.nextInt();
                    int last = list.size() - 1;
                    for (int i = last; i > last - n; i--) {
                        String key = list.get(i).getKey();
                        Integer value = list.get(i).getValue();
                        System.out.println(key + " :" + value);
                    }
                }
    
                
            }

    输出单个文件中的前 N 个最常出现的英语单词。程序运行结果如图:

    总结:这两步的程序都用到了对文件的读取,以及数组的使用

  • 相关阅读:
    arcgis连接oracle发布服务,提示数据未注册到服务器,手动注册服务器失败
    安装arcgis server时提示“应用程序无法启动,因为应用程序......或使用命令行sxstrace.exe”
    创建自定义地理(坐标)变换
    坐标系转换方式
    ArcSDE数据库、文件地理数据库和个人地理数据库的区别
    4D
    Oracle 11g中创建实例
    Oracle 10g客户端的安装和配置
    Oracle 11g服务端的安装和配置
    类装载器ClassLoader
  • 原文地址:https://www.cnblogs.com/zhaoxinhui/p/11002875.html
Copyright © 2020-2023  润新知