《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 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

{

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]

{

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;

}

}

运行结果截图:

56398dc8695dbcad312701fb07d7e799.png

要求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中

Map myTreeMap=new TreeMap();

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> list = new ArrayList>(myTreeMap.entrySet());

//按降序排序

Collections.sort(list, new Comparator>() {

public int compare(Entry k1, Entry k2) {

//返回两个单词出现次数较多的那个单词的出现次数

return k2.getValue().compareTo(k1.getValue());

}

});

System.out.println("请输入要输出频率最高的前N个单词:");

n=input.nextInt();

for(Map.Entry 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("输出完成");

}

}

运行截图为:

4f51b53da4db024dd4f3d067e3057ee9.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值