IO课堂测试
一,用户需求
英语的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课堂测试的更多相关文章
- 20155228 2017-5-31 课堂测试:编写MyOD.java
20155228 2017-5-31 课堂测试:编写MyOD.java 题目和要求 编写MyOD.java:用java MyOD XXX实现Linux下od -tx -tc XXX的功能 提交测试代码 ...
- 20145209刘一阳《JAVA程序设计》第九周课堂测试
第九周课堂测试 1.域名解析服务器(ARP)负责将域名转化为IP地址,从而与主机连接.(B) A .true B .false 2.下列关于URL类的说法,正确的是(BD) A .URL 类自身可根据 ...
- 20145209刘一阳《JAVA程序设计》第五周课堂测试
第五周课堂测试 1.下列关于内部类的说法,正确的是(ABD) A .其他类不可以用某个类的内部类声明对象. B .内部类字节码文件的名字格式是"外嵌类名$内部类名". C .内部类 ...
- IO_课堂测试
IO_课堂测试 一,用户需求 英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?<飘> 中最常用的短语是什么,等等. (1)要求1 ...
- 课堂测试_WEB界面链接数据库
课堂测试_WEB界面链接数据库 一,题目: 一. 考试要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求 ...
- 耿丹CS16-2班课堂测试作业汇总
Deadline: 2016-11-01 11:59 作业内容 课堂测试作业总结 00.题目得5分,多半扣在格式上,有些同学代码写得很过分,已经很仁慈对待,同学们珍惜之: 01.界面设计得分不好,换行 ...
- 课堂测试ch06
课堂测试ch06 下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为(D) A. 1 B. 1/4 C. 1/2 D. 3/4 解析:在填充了之后,对于x和y数组,只有在引用 ...
- 20155306 2017-2018-1《信息安全系统设计》第二周课堂测试以及myod的实现
20155306 2017-2018-1<信息安全系统设计>第二周课堂测试以及myod的实现 第二周课堂测验: (注:前两项在课堂已提交,在此不做详解) 第一项: 每个.c一个文件,每个. ...
- 课堂测试——jsp登录界面设计
实现结果:在login.jsp页面提交用户名和密码(可以验证是否为空),点击登录跳转到loginResult.jsp页面进行验证并显示结果 JSP + JDBC + MySQL login.jsp 设 ...
随机推荐
- 拦截导弹类问题 (Codevs4888零件分组POJ1065Wooden Sticks)(LIS及其覆盖问题)
拦截导弹 题意:求最长不上升子序列长度:求一个序列最少分成几个非增子序. 第一问易求,已知序列a,令f[i]为a前i个元素的最长非增子序的长度,则有 f[i]=max{f[i],f[j]+1} (1& ...
- Centos7 安装 Cockpit
1sudo yum -y install epel-release sudo yum -y update sudo shutdown -r now 2yum -y install cockpit sy ...
- 期货、期权tick数据接收
功能: 1.开启之后,7*24自动运行. 2.在共享内存中存放当个交易日的tick数据,方便随时取用. 3.支持多行情源取数据.经过测试一个行情源峰值带宽要求为20M,所以使用时要配合带宽限制. 4. ...
- Oracle常用函数记录
Oracle函数 --schema:hcf --不带任何参数 http://www.cnblogs.com/wuyisky/archive/2010/05/11/oracle_function.htm ...
- eureka服务只能设置8761,不然服务无法注册
原因是,eureka服务端和eureka的客户端在一个project下,只是属于不同的模块.所以出现了以上问题.分开项目就好了.
- springboot06(静态资源映射)
xxxxAutoConfiguration xxxxproperties 对静态资源的映射规则 webjars @ConfigurationProperties(prefix = "spri ...
- Bugku-CTF加密篇之python(N1CTF) [HRlgC2ReHW1/WRk2DikfNBo1dl1XZBJrRR9qECMNOjNHDktBJSxcI1hZIz07YjVx]
python(N1CTF)
- 【想见你】剧情解析byZlc
花两天时间刷完了想见你,精神有点恍惚. 要是刷题也能有这个尽头就好了... 下面给大家带来个人的剧(hu)情(bian)解(luan)析(zao) 穿越条件:一台老式随身听,一首last dance, ...
- centos 6.10 安装mysql 5.7.27 出现缺少libnuma.so.1的问题
centos 6.10安装mysql 5.7.27出现以下报错: [root@localhost /]# /usr/local/mysql/app/mysql/bin/mysqld --default ...
- Python学习之函数篇
python查看对象,函数帮助文档:.__doc__,例:str.split.__doc__ 查看详细对象,函数文档:help(),例:help(str.split) 函数参数可设置默认值 如果不能提 ...