单词统计

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

 第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 个最常出现的英语单词。程序运行结果如图:

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

原文地址:https://www.cnblogs.com/zhaoxinhui/p/11002875.html