用户需求:

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

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

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

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

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

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

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

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

第1步:输出单个文件中的前 N 个最常出现的英语单词。

作用:一个用于统计文本文件中的英语单词出现频率。

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

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

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

1步:输出单个文件中的前 N 个最常出现的英语单词。

分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。good,Good和GOOD是同一个单词。

实验思想:

 通过文件流读入飘英文版的内容,排除无用字符,统计字母个数,然后计算频率。

实验代码:

统计字母个数和频率

package sy0509_ZiMu;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;


public class sy0509 {
public static void main(String[] args)throws IOException
{
    List<Integer> list=new ArrayList<>();
    DecimalFormat df=new DecimalFormat("######0.00");    //格式化
//    File f = new File("D:\\飘英文版.txt");
     FileInputStream fip = new FileInputStream("D:\\飘英文版.txt");
    InputStreamReader reader = new InputStreamReader(fip, "gbk");
    StringBuffer sb = new StringBuffer();
    while (reader.ready()) {
        sb.append((char) reader.read());
    }
    System.out.println(sb.toString());
    reader.close();
    fip.close();
    
    int i;
    String A=sb.toString();
    String M="abcdefghijklmnopqrstuvwxyz";
   String temp = "";
    char NUM[]=new char[A.length()];
    char Z[]=new char[26];
    int X[]=new int[26];
    int MAX=0;
    Z=M.toCharArray();
    for(int k=0;k<26;k++)
    {
        X[k]=0;
    for(i=0;i<A.length();i++)
    {
        NUM[i]=A.charAt(i);
        if(Z[k]==NUM[i]||Z[k]==ch(NUM[i]))
        {
            X[k]++;
        }
    }
    }
    System.out.println("这篇文章中英文字母个数分别为:");
    
    double sum=0;
    System.out.println("////////////排序如下:");
    for(i=0;i<25;i++)
        for(int k=0;k<25-i;k++)
        {
            if(X[k]<X[k+1])
            {
                int temp2=X[k];
                X[k]=X[k+1];
                X[k+1]=temp2;
                char temp3=Z[k];
                Z[k]=Z[k+1];
                Z[k+1]=temp3;
            }
        }
    for(i=0;i<26;i++)
    {
    System.out.println(Z[i]+"字母个数为:"+X[i]);
    sum=sum+X[i];
    }
    for(i=0;i<26;i++)
    {
        double jkl=(X[i])/sum*100;
        System.out.println(Z[i]+"字母频率为:"+df.format(jkl)+"%");
    }
}
static char ch(char c)
{
    if(!(c>=97&&c<=122))
        c+=32;
    return c;
}
}

实验结果截图:

 

posted on 2019-05-05 18:41  金猫大帝  阅读(643)  评论(0编辑  收藏  举报