课堂测试:用户需求:英语的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;
}
}
运行结果截图:
要求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("输出完成");
}
}
运行截图为: