zoukankan      html  css  js  c++  java
  • 《Java语言程序设计》

    课堂测试:用户需求:英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?《Harry Potter》 中最常用的短语是什么,等等。 要求:输出单个文件中的前 N 个最常出现的英语单词,并将结果输入到文本文件中。

    要求1:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。 字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数) 如果两个字母出现的频率一样,那么就按照字典序排列。

    源代码为:

    package Frequency;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.List;

    public class Frequency {
    public static void main(String[] args)throws IOException
    {
    List<Integer> list=new ArrayList<>();
    DecimalFormat df=new DecimalFormat("######0.00");
    FileInputStream fip = new FileInputStream("C:\\Users\\向瑜\\eclipse-workspace\\Harry Potter\\Harry Potter and the Sorcerer's Stone.txt");//存放《Harry Potter》文件的地址
    InputStreamReader reader = new InputStreamReader(fip, "gbk");
    StringBuffer sb = new StringBuffer();
    while (reader.ready()) {
    sb.append((char) reader.read());
    }
    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++) {
    sum=sum+X[i];
    }
    for(i=0;i<26;i++)
    {
    double jkl=(X[i])/sum*100;
    System.out.println(Z[i]+"字母个数为:"+X[i]+"字母频率为:"+df.format(jkl)+"%");
    }

    }
    static char ch(char c)
    {
    if(!(c>=97&&c<=122))
    c+=32;
    return c;
    }

    }

    运行结果截图:

    要求2:输出单个文件中的前 N 个最常出现的英语单词。 作用:一个用于统计文本文件中的英语单词出现频率的控制台程序; 单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。

    源代码为:

    package Words;
    import java.io.*;
    import java.util.*;
    import java.util.Map.Entry;

    public class Single
    {
    public static int n=0;
    public static void main(String[] args) {
    Scanner input=new Scanner(System.in);
    String s;
    int count=0;
    int num=1;
    //作为FileReader和FileWriter读取的对象
    String file1="C:\\\\Users\\\\向瑜\\\\eclipse-workspace\\\\Harry Potter\\\\Harry Potter and the Sorcerer's Stone.txt";//存放《Harry Potter》文件的地址
    String file2="C:\\\\Users\\\\向瑜\\\\eclipse-workspace\\\\Harry Potter\\\\Harry Potter and the Sorcerer's Stone1.txt";//在存放《Harry Potter》文件的地址下新建的空白文件夹
    try
    {
    BufferedReader a=new BufferedReader(new FileReader(file1));
    BufferedWriter b=new BufferedWriter(new FileWriter(file2));
    StringBuffer c=new StringBuffer();
    //将文件内容存入StringBuffer中
    while((s = a.readLine()) != null)
    {
    //用于拼接字符串
    c.append(s);
    }
    //将StringBuffer转换成String,然后再将所有字符转化成小写字符
    String m=c.toString().toLowerCase();
    //匹配由数字和26个字母组成的字符串
    String [] d=m.split("[^a-zA-Z0-9]+");
    //遍历数组将其存入Map<String, Integer>中
    Map<String , Integer> myTreeMap=new TreeMap<String, Integer>();
    for(int i = 0; i < d.length; i++) {
    //containsKey()方法用于检查特定键是否在TreeMap中映射
    if(myTreeMap.containsKey(d[i])) {
    count = myTreeMap.get(d[i]);
    myTreeMap.put(d[i], count + 1);
    }
    else {
    myTreeMap.put(d[i], 1);
    }
    }
    //通过比较器实现排序
    List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(myTreeMap.entrySet());
    //按降序排序
    Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {

    public int compare(Entry<String, Integer> k1, Entry<String, Integer> k2) {
    //返回两个单词出现次数较多的那个单词的出现次数
    return k2.getValue().compareTo(k1.getValue());
    }

    });
    System.out.println("请输入要输出频率最高的前N个单词:");
    n=input.nextInt();
    for(Map.Entry<String, Integer> map : list) {
    if(num <= n) {
    //按内容输出到指定文件中去
    b.write("出现次数第" + num + "的单词为:" + map.getKey() + ",出现频率为" + map.getValue() + "次");
    //换行
    b.newLine();
    //输出到程序控制台
    System.out.println(map.getKey() + ":" + map.getValue());
    num++;
    }
    //输出完毕退出
    else break;
    }
    //关闭文件指针
    a.close();
    b.close();
    }
    catch(FileNotFoundException e)
    {
    System.out.println("找不到指定文件");
    }
    catch(IOException e)
    {
    System.out.println("文件读取错误");
    }
    System.out.println("输出完成");
    }
    }

    运行截图为:

  • 相关阅读:
    【RxJava Demo分析】(二)Schedulers线程调度器 · Hans Zone
    Docker Swarm和Kubernetes在大规模集群中的性能比较
    Linux用户组的添加及属性的更改
    SurfaceView和TextureView的区别
    吴裕雄--天生自然 R语言开发学习:使用键盘、带分隔符的文本文件输入数据
    吴裕雄--天生自然 高等数学学习:区间
    吴裕雄--天生自然 R语言开发学习:数据集和数据结构
    吴裕雄--天生自然 R语言开发学习:R语言的简单介绍和使用
    吴裕雄--天生自然 高等数学学习:前言
    吴裕雄--天生自然 R语言开发学习:基础知识
  • 原文地址:https://www.cnblogs.com/xiangyu721/p/11800103.html
Copyright © 2011-2022 走看看