一,用户需求

英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?《哈利波特与魔法石》 中最常用的短语是什么,等等。

(1)要求1:

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

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

2,如果两个字母出现的频率一样,那么就按照字典序排列。)

首先是代码:

 package filesearch;
import java.io.*;
import java.text.DecimalFormat;
import java.util.*;
public class Filesearch {
static String str ="";
static String str1="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
static char ch1[]= str1.toCharArray();
public static double num[]=new double[100];
public static int sum=0;
public static void readFile(){
File file = new File("f:\\qq\\Harry Potter and the Sorcerer's Stone.txt");
try {
FileReader r = new FileReader(file);
BufferedReader br = new BufferedReader(r);
int i=0;
str=br.readLine();
//将每个字母的出现次数保存到数组中
while(str!=null) {
for(int j=0;j<str.length();j++) {
for(int k=0;k<str1.length();k++) {
if(str.charAt(j)==str1.charAt(k)) {
sum++;
num[k]++;
}
}
}
str=br.readLine();
}
//将文件流关闭
br.close();
//将出现次数进行排序(选择排序法)
for(int p=0;p<str1.length()-1;p++) {
int o=p;
for(int q=p;q<str1.length();q++) {
if(num[o]<num[q]) {
o=q;
}
}
if(o!=p) {
char ff=ch1[o];
ch1[o]=ch1[p];
ch1[p]=ff;
double fff=num[o];
num[o]=num[p];
num[p]=fff;
}
}
//输出排序后的结果
for(int k=0;k<str1.length();k++) {
num[k]=num[k]/sum*100;
System.out.print(ch1[k]);
System.out.print(" ");
System.out.printf("%.2f",num[k]);
System.out.println("%");
}
}
catch(FileNotFoundException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
readFile();
}
}

思路:

1.创建一个数组ch1,存储所有的字母(a-z,A-Z),创建一个同样大小的int数组num.

2.遍历文件,按行读取文件并依次对字母数组进行比对,找到时对应的num++(用ch1的下标,即相互对应起来).

3.对num中和ch1的数据同步排序。

4.输出对应结果。

要求2:

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

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

思路分析:

1)循环:按行读取文件,并将本行用toLowerCase()把大写改成小写,并按空格分割存进数组中。

2)找出每个出现过的单词。

3)对所有单词进行遍历,求出每个不重复单词的个数存入int数组。

4)对int数组和单词数组同步排序。

5)输出前N个单词及其个数。

代码如下:

 package filesearch;
import java.io.*;
import java.util.*;
public class FileSearchWords {
private static String str = "";
private static Scanner sc = new Scanner(System.in);
private static BufferedReader cin = null;
private static String a[]=new String[100000];
private static String c[]= new String[1000000];
private static int b[]=new int[1000000];
private static int length=0,length1=0,nn=0,j=0;
//读取文本数据
public static void ReadFile() {
File file = new File("F:\\qq\\Harry Potter and the Sorcerer's Stone.txt");
try {
InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8");
cin = new BufferedReader(read);
str = cin.readLine();
store();
cin.close();
read.close();
}
catch(IOException e) {
System.out.println("读取失败!");
e.printStackTrace();
}
}
//将所有单词存到数组a
public static void store() throws IOException{
while(str!=null) {
int i=0;
str=str.toLowerCase();
for(i=0;i<str.length();i++) {
if((str.charAt(i)>96&&str.charAt(i)<123)) {
a[j]=a[j]+str.charAt(i);
}
if(str.charAt(i)==' '||str.charAt(i)==','||str.charAt(i)=='.') {
if(!a[j].equals("")) {
j=j+1;
a[j]="";
}
}
}
str=cin.readLine();
}
length=j;
}
//统计每个单词出现的次数
public static void Statistics() {
for(int k=0;k<length;k++) {
b[k]=0;
}
c[0]=a[0];
int tt=1;
Boolean rt = true;
for(int i=1;i<length;i++) {
rt=false;
//找出每个单词的第一次
for(int j=0;j<tt;j++) {
if(a[i].equals(c[j])) {
rt=true;
break;
}
}
if(!rt) {
c[tt]=a[i];
tt++;
}
}
length1=tt;
//将每个单词的出现次数统一一下
for(int i=0;i<length1;i++) {
for(int j=0;j<length;j++) {
if(c[i].equals(a[j])) {
b[i]++;
}
}
}
}
//用选择排序法将次数和对应单词一一排序
public static void Sort() {
int t3=0,t2=0;
String sr="";
for(int i=0;i<length1-1;i++) {
t3=i;
for(int j=i+1;j<length1;j++) {
if(b[t3]<b[j]) {
t3=j;
}
}
if(t3!=i) {
t2=b[i];
b[i]=b[t3];
b[t3]=t2;
sr=c[i];
c[i]=c[t3];
c[t3]=sr;
}
}
}
//输出结果
public static void show() {
for(int k=0;k<nn;k++) {
System.out.print(c[k]+"\t"+b[k]+" ");
System.out.printf("%.2f",(double)b[k]/length1*100);
System.out.print("%");
System.out.println("");
}
}
public static void main(String [] args) throws IOException{
System.out.println("请输入需要统计的个数:");
nn=sc.nextInt();
a[0]="";
ReadFile();
Statistics();
Sort();
show();
}
}

要求3(功能1):

输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。

思路分析:

1)循环:按行读取文件,并将本行用toLowerCase()把大写改成小写,并按空格分割存进数组中。

2)找出所有单词的第一次。

3)对所有单词进行遍历,求出每个不重复单词的个数存入int数组。

4)对int数组和单词数组同步排序。

5)输出所有个单词及其个数。

(实际上,要求3和要求2基本是相同的,只需在要求2的代码基础上稍做更改即可)

代码如下:

 package filesearch;
import java.io.*;
import java.util.*;
public class FileSearchWords {
private static String str = "";
private static Scanner sc = new Scanner(System.in);
private static BufferedReader cin = null;
private static String a[]=new String[100000];
private static String c[]= new String[1000000];
private static int b[]=new int[1000000];
private static int length=0,length1=0,nn=0,j=0;
//读取文本数据
public static void ReadFile() {
File file = new File("F:\\qq\\Harry Potter and the Sorcerer's Stone.txt");
try {
InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8");
cin = new BufferedReader(read);
str = cin.readLine();
store();
cin.close();
read.close();
}
catch(IOException e) {
System.out.println("读取失败!");
e.printStackTrace();
}
}
//将所有单词存到数组a
public static void store() throws IOException{
while(str!=null) {
int i=0;
str=str.toLowerCase();
for(i=0;i<str.length();i++) {
if((str.charAt(i)>96&&str.charAt(i)<123)) {
a[j]=a[j]+str.charAt(i);
}
if(str.charAt(i)==' '||str.charAt(i)==','||str.charAt(i)=='.') {
if(!a[j].equals("")) {
j=j+1;
a[j]="";
}
}
}
str=cin.readLine();
}
length=j;
}
//统计每个单词出现的次数
public static void Statistics() {
for(int k=0;k<length;k++) {
b[k]=0;
}
c[0]=a[0];
int tt=1;
Boolean rt = true;
for(int i=1;i<length;i++) {
rt=false;
//找出每个单词的第一次
for(int j=0;j<tt;j++) {
if(a[i].equals(c[j])) {
rt=true;
break;
}
}
if(!rt) {
c[tt]=a[i];
tt++;
}
}
length1=tt;
//将每个单词的出现次数统一一下
for(int i=0;i<length1;i++) {
for(int j=0;j<length;j++) {
if(c[i].equals(a[j])) {
b[i]++;
}
}
}
}
//用选择排序法将次数和对应单词一一排序
public static void Sort() {
int t3=0,t2=0;
String sr="";
for(int i=0;i<length1-1;i++) {
t3=i;
for(int j=i+1;j<length1;j++) {
if(b[t3]<b[j]) {
t3=j;
}
}
if(t3!=i) {
t2=b[i];
b[i]=b[t3];
b[t3]=t2;
sr=c[i];
c[i]=c[t3];
c[t3]=sr;
}
}
}
//输出结果
/*public static void show() {
for(int k=0;k<nn;k++) {
System.out.print(c[k]+"\t"+b[k]+" ");
System.out.printf("%.2f",(double)b[k]/length1*100);
System.out.print("%");
System.out.println("");
}
}*/
public static void show1() {
for(int k=0;k<length1;k++) {
System.out.print(c[k]+"\t \t\t"+b[k]+"\n");
}
}
//将所有结果输出到文件中
public static void Writefile() throws IOException {
File file=new File("t1.txt");
if(!file.exists())
file.createNewFile();
FileWriter write = new FileWriter(file,true);
BufferedWriter out=new BufferedWriter(write);
for(int i=0;i<length1;i++){
StringBuffer sb=new StringBuffer();
out.write("这是第"+(i+1)+"个: "); double f4=(double)b[i]/length1*100;
out.write(c[i]+"\t"+b[i]+"\t"+f4);
out.write("\r\n"); }
out.close();
}
public static void main(String [] args) throws IOException{
//System.out.println("请输入需要统计的个数:");
//nn=sc.nextInt();
a[0]="";
ReadFile();
Statistics();
Sort();
//show1();
Writefile();
}
}

刚开始输出发现控制台无法读取到如此多的数据,在上网查找了原因后发现是控制台的缓冲区不够,于是将结果写入到了文件里。

要求4(功能二):

指定文件目录,递归遍历每个子目录,并执行 功能1。

思路分析:

1)找出所给目录中的所有文件存入数组。

2)找出所有文件名的第一次。

3)对所有文件名进行遍历,求出每个不重复单词的个数存入int数组。

4)对int数组和文件名数组同步排序。

5)输出所有文件名及其个数。

代码如下:

查看代码

可以看到,这里用了对文件夹处理的相关方法和操作。

IO课堂测试的更多相关文章

  1. 20155228 2017-5-31 课堂测试:编写MyOD.java

    20155228 2017-5-31 课堂测试:编写MyOD.java 题目和要求 编写MyOD.java:用java MyOD XXX实现Linux下od -tx -tc XXX的功能 提交测试代码 ...

  2. 20145209刘一阳《JAVA程序设计》第九周课堂测试

    第九周课堂测试 1.域名解析服务器(ARP)负责将域名转化为IP地址,从而与主机连接.(B) A .true B .false 2.下列关于URL类的说法,正确的是(BD) A .URL 类自身可根据 ...

  3. 20145209刘一阳《JAVA程序设计》第五周课堂测试

    第五周课堂测试 1.下列关于内部类的说法,正确的是(ABD) A .其他类不可以用某个类的内部类声明对象. B .内部类字节码文件的名字格式是"外嵌类名$内部类名". C .内部类 ...

  4. IO_课堂测试

    IO_课堂测试 一,用户需求 英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?<飘> 中最常用的短语是什么,等等. (1)要求1 ...

  5. 课堂测试_WEB界面链接数据库

    课堂测试_WEB界面链接数据库 一,题目: 一. 考试要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求 ...

  6. 耿丹CS16-2班课堂测试作业汇总

    Deadline: 2016-11-01 11:59 作业内容 课堂测试作业总结 00.题目得5分,多半扣在格式上,有些同学代码写得很过分,已经很仁慈对待,同学们珍惜之: 01.界面设计得分不好,换行 ...

  7. 课堂测试ch06

    课堂测试ch06 下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为(D) A. 1 B. 1/4 C. 1/2 D. 3/4 解析:在填充了之后,对于x和y数组,只有在引用 ...

  8. 20155306 2017-2018-1《信息安全系统设计》第二周课堂测试以及myod的实现

    20155306 2017-2018-1<信息安全系统设计>第二周课堂测试以及myod的实现 第二周课堂测验: (注:前两项在课堂已提交,在此不做详解) 第一项: 每个.c一个文件,每个. ...

  9. 课堂测试——jsp登录界面设计

    实现结果:在login.jsp页面提交用户名和密码(可以验证是否为空),点击登录跳转到loginResult.jsp页面进行验证并显示结果 JSP + JDBC + MySQL login.jsp 设 ...

随机推荐

  1. 页面中<link>和<script>标签

    在html中,经常肯定会有js,css的引入 <head> <title>MyHtml</title> <link rel="stylesheet& ...

  2. command failed: npm install --loglevel error --registry=https://registry.npm 用vue-cli 4.0 新建项目总是报错

    昨天新买的本本,今天布环境,一安装vue-cli发现都4.0+的版本了,没管太多,就开始新建个项目感受哈,一切运行顺利,输入 "vue create app" 的时候,一切貌似进展 ...

  3. 【SIKI学院】愤怒的小鸟创建过程-2

    第二讲:Spring joint组建介绍 点重小鸟右侧add component输入spring joint,选择spring joint 2D(弹簧关节).给右侧树枝加刚体选择physics 2D- ...

  4. 优化 : Oracle数据库Where条件执行顺序 及Where子句的条件顺序对性能的影响

    .Oracle数据库Where条件执行顺序: 由于SQL优化起来比较复杂,并且还会受环境限制,在开发过程中,写SQL必须必须要遵循以下几点的原则: 1.ORACLE采用自下而上的顺序解析WHERE子句 ...

  5. hadoop fs -put could only be replicated to 0 nodes, instead of 1 解决方法

    我的坏境是在虚拟机linux操作系统中,启动start-all.sh后 1.执行jps,如下 2.执行hadoop fs -mkdir input 创建成功 执行hadoop fs -ls 可以看到i ...

  6. 【资源分享】Dll Injector(DLL注入器)

    *----------------------------------------------[下载区]----------------------------------------------* ...

  7. Vue2.0 中,“渐进式框架”和“自底向上增量开发的设计”这两个概念是什么?(转)

    https://www.zhihu.com/question/51907207?rf=55052497 徐飞 在我看来,渐进式代表的含义是:主张最少. 每个框架都不可避免会有自己的一些特点,从而会对使 ...

  8. 查看Mysql数据库版本

    一.使用终端 1.参数为-V(大写字母)或者--version 使用方法: D:\mysql\bin>mysql -V 或者 D:\mysql\bin>mysql --version

  9. [原]eclipse中spring配置文件的自动提示和命名空间的添加

    在用spring或者springmvc框架进行开发时,编辑applicationcontext.xml等配置文件是必不可少的,在eclipse中打开applicationcontext.xml通常是这 ...

  10. oracle 唯独测试视图

    --建立用户分配权限 create user groper identified by groper / grant connect,resource to groper / grant create ...