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 设 ...
随机推荐
- JS 每次进入自动加载JS
对于动态文件,比如 index.asp?id=... 或者 index.aspx?id=... 相信有经验的程序员都知道怎样禁止浏览器缓存数据了.但是对于静态文件(css,jpg,gif等等), 在什 ...
- Python记之薄暮笔记
——————————————————————————————接下来请欣赏与众不同的表演. Python打印所有的字符串时,都用引号将其括起. 有一些独特而有用的字符串表示方式. 可使用三引号表示很长的 ...
- 剑指offer 面试题36.二叉搜索树与双向链表
中序递归,一个pre节点记录前一个节点 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tre ...
- Java实现Word/Pdf/TXT转html
引言: 最近公司在做一个教育培训学习及在线考试的项目,本人主要从事网络课程模块,主要做课程分类,课程,课件的创建及在线学习和统计的功能,因为课件涉及到多种类型,像视频,音频,图文,外部链接及文档类型. ...
- const与#define的区别、优点
const与#define的区别 编译器处理方式不同 define宏是在预处理阶段展开. 补充:预处理器根据以#开头的命令,修改原始的程序.比如我们常见的#include <stdio.h> ...
- VS2015打开失败
在使用VS2015过程中之前能打开的.Net项目,结果突然就不能使用了.我就不能理解了,后来找了一个方法,抱着试试的心态结果就成功了. 解决办法 第一步: 开始-->所有程序-->Micr ...
- frm、myd、myi、opt、par文件
.frm 表结构文件 .myd 表数据文件 .myi 表索引文件 .opr 储存数据库的默认字符集 .par 储存分区信息 mysql 5.6版本分区表有一个文件:表名.par, 该文件在5.7.6版 ...
- Flutter 中的表单
一.Flutter 常用表单介绍 Flutter 中常见的表单有 TextField 单行文本框,TextField 多行文本框.CheckBox.Radio.Switch CheckboxLi ...
- Network - HTTP 可能遇到的状态码
1. 概述 工作中, 会遇到 形形色色 的状态码 虽然这些状态码, 很多都是自定义的, 但是很多的 自定义, 还是有些 约定俗成 的规律 状态 虽然现在发布了, 但是基本算是没有, 还得慢慢补充 2. ...
- Educational Codeforces Round 81 (Rated for Div. 2)E(线段树)
预处理把左集划分为大小为1~i-1时,把全部元素都移动到右集的代价,记作sum[i]. 然后枚举终态时左集的大小,更新把元素i 留在/移动到 左集的代价. 树状数组/线段树处理区间修改/区间查询 #d ...