Java的实验程序之输出单个文件中的前 N 个最常出现的英语单词
日期:2018.10.11
星期四
博客期:016
题目:输出单个文件中的前 N 个最常出现的英语单词,并输出到文本文件中
在程序运行之前,我试着先写了字符的字母的总结,加载代码如下:
//如下是第一个程序的 CharBasic文件
package src; public final class CharBasic {
//检测字母是否为字母
public static boolean isAtoZ(char c){
return c<='z'&&c>='A';
}
//检测字母是否为大写
public static boolean isBig(char c){
return c>='A'&&c<='Z';
}
//检测字母是否为小写
public static boolean isSmall(char c){
return c>='a'&&c<='z';
}
//转换字符的大小写
public static char ChangeBigSmall(char c){
if(CharBasic.isBig(c))
return (char)(c+'a'-'A');
else if(CharBasic.isSmall(c))
return (char)(c+'A'-'a');
else
return '\0';
}
//int与char的"类型"转换
public static char Changeintchar(int x){
return (char)(''+x);
}
public static int Changeintchar(char c){
return (char)(c-'');
}
//主方法
public static void main(String[] args) { }
}
//如下是第一个程序的 CharManager.java 文件
package src; public class CharManager {
//字符
private char cha;
//次数
private int num;
//cha的set、get方法
public void setcha(char chas){
cha = chas;
}
public char getcha(){
return cha;
}
//num的set、get方法
public void setnum(int nums){dda
num = nums;
}
public int getnum(){
return num;
}
//num的++方法
public void add(){
num++;
}
public void add(int n){
num = num + n;
}
//打印方法
public void Print(){
System.out.println(cha+"\t"+num);
}
//构造方法
public CharManager(){
num = ;
cha = ' ';
}
public CharManager(char t){
num = ;
cha = t;
}
public static void main(String[] args) {
CharManager t = new CharManager('f');
t.add();
t.setcha('A');
}
}
//如下是第一个程序的 CharDate.java 文件
package src; import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner; public class CharDate {
//============================================<数据域>=============================================//
//字符数据库
private CharManager []date = null;
//确定长度
private int length;
//最大长度
private int MaxSize;
//============================================<方法域>=============================================//
//基础设置方法
public void SetLength(int l){
length = l;
}
public int GetLength(){
return length;
}
public void SetManger(int seat,char value,int times){
date[seat].setcha(value);
date[seat].setnum(times);
}
public void SetManger(int seat,CharManager a){
date[seat].setcha(a.getcha());
date[seat].setnum(a.getnum());
}
public CharManager GetManger(int seat){
return date[seat];
}
//判断数据库内部是否已满
public boolean isfull(){
return length==MaxSize;
}
//判断数据库内部是否为空
public boolean isempty(){
return length==;
}
//判断数据库内部是否含有c字符
public boolean havethechar(char c){
for(int i=;i<length;++i)
if(c==date[i].getcha())
return true;
return false;
}
//返回数据库内部字符c的位置
public int SearchSeat(char c){
for(int i=;i<length;++i)
if(c==date[i].getcha())
return i;
return -;
}
//对新字母进行处理
public void DealWithAtoZ(char c,boolean identifybigorsmall){
if(CharBasic.isAtoZ(c))
{
if(!identifybigorsmall)
{
if(havethechar(c))
date[SearchSeat(c)].add();
else if(havethechar(CharBasic.ChangeBigSmall(c)))
date[SearchSeat(CharBasic.ChangeBigSmall(c))].add();
else
{
if(length<MaxSize)
{
date[length].setcha(CharBasic.isSmall(c)?c:CharBasic.ChangeBigSmall(c));
date[length].setnum();
length++;
}
else
{
System.out.println("OverFlow!");
return;
}
}
}
else
{
if(havethechar(c))
date[SearchSeat(c)].add();
else
{
if(length<MaxSize)
{
date[length].setcha(c);
date[length].setnum();
length++;
}
else
{
System.out.println("OverFlow!");
return;
}
}
}
}
else
{
System.out.println("Not A to Z!");
return;
}
}
public void DealWithHavedAtoZ(char c,boolean identifybigorsmall){
if(CharBasic.isAtoZ(c))
{
if(!identifybigorsmall)
{
if(havethechar(c))
date[SearchSeat(c)].add();
else if(havethechar(CharBasic.ChangeBigSmall(c)))
date[SearchSeat(CharBasic.ChangeBigSmall(c))].add();
}
else
{
date[SearchSeat(c)].add();
}
}
else
{
System.out.println("Not A to Z!");
return;
}
}
//计算总数
public int Sum(){
int sum = ;
for(int i=;i<length;i++)
sum = sum + date[i].getnum();
return sum;
}
//计算概率
public double pointValue(int seat){
return (double)date[seat].getnum()/(double)Sum();
}
//打印次数
public void Printnum(int seat){
System.out.println(date[seat].getcha()+" : "+date[seat].getnum());
}
public void Printnum(){
for(int i=;i<length;i++)
System.out.println(date[i].getcha()+" : "+date[i].getnum());
}
//打印概率
public void PrintpointValue(int seat){
System.out.println(date[seat].getcha()+" : "+pointValue(seat)*+"%");
}
public void PrintpointValue(){
for(int i=;i<length;i++)
System.out.println(date[i].getcha()+" : "+pointValue(i)*+"%");
}
//从文件导入
public void BuildFromFile(String fileName){
try {
char []temp;
Scanner sc = new Scanner(new FileReader(fileName));
String string = sc.next();
temp = string.toCharArray();
for(int i=;i<temp.length;i++)
DealWithHavedAtoZ(temp[i],true);
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
//构造方法
public CharDate(){
MaxSize = ;
length = ;
date = new CharManager [];
}
public CharDate(int max){
MaxSize = max;
length = ;
date = new CharManager [max];
for(int i=;i<max;i++)
date[i] = new CharManager();
}
public CharDate(boolean identifybigorsmall){
if(identifybigorsmall)
{
MaxSize = ;
length = ;
date = new CharManager [];
for(int i=;i<;i++){
date[i] = new CharManager((char)((int)'A'+i));
}
}
else
{
MaxSize = ;
length = ;
date = new CharManager [];
for(int i=;i<;i++){
date[i] = new CharManager((char)((int)'a'+i));
}
}
}
//主方法
public static void main(String[] args) {
CharDate cd = new CharDate(false);
cd.BuildFromFile("files/save.txt");
cd.Printnum();
}
}
大致上就是如此,其中问题还是遇到了好多的!比如说一开始我没想大小写转化的情况,那个添加载入一个字符的方法,一开始只有判断一个字符是否存在,再然后就可以执行操作了,但实际上加入大小写不区分后,就需要多加一个参数 ifidentifybigorsmall(是否区分大小写),以及多了一重判断!再加上这个参数的判断,以及多加上操作——对两个字符的分别操作!
再说说本来要做的程序吧!这个就比字符麻烦多了!......呃,其实...吧!也没麻烦多少啊!多加了几个方法,多了几个判断!差不多就写出来了!先说,说完我在展示我的代码!谈到这个String和char[]进行转换也遇到了一些小问题!首先就是那个方法String.toCharArray();这是将字符串大类转成字符数组的方法!利用String的辅助类StringBuffer类来完成一些操作,比如利用delete(0,1);来删除第一位置的字符,用insert(0,char x);来在字符的第一位置存入新的字符,这样就可以把首字母大写的字符串改过来,改成全小写的字符串!再者就是删除字符串的特殊字符——'.'、','、'\“'、'-'等等英文语句内含有的标点符号!再者就是对数据库里的数据处理,找到出现频率排前N名的字符串,至于导出到文件里边就是小case啦!下面写我的代码:
//如下是第二个程序的 StringBasic.java 文件
package src; public class StringBasic {
//输出
public static void pr(String x){
System.out.print(x);
}
//判断字符串是否为大写字母开头
public static boolean isBigFirst(String str){
char []br = str.toCharArray();
if(br[]>='A'&&br[]<='Z')
return true;
else
return false;
}
//判断字符串是否为大写字母开头
public static boolean isSmallFirst(String str){
char []br = str.toCharArray();
if(br[]>='a'&&br[]<='z')
return true;
else
return false;
}
//将字符串str的开头字符转为小写
public static String ChangeToSmall(String str){
StringBuffer sb = new StringBuffer(str);
char s = sb.charAt();
if(!StringBasic.isBigFirst(str))
return "\0";
sb.delete(,);
s = (char)(s-'S'+'s');
sb.insert(,s);
return sb.toString();
}
//字符串全转小写
public static String ToSmall(String x){
return x.toLowerCase();
}
//字符串全转大写
public static String ToBig(String x){
return x.toUpperCase();
}
//字符串删除标点符号
public static String DeleteString(String x){
x = x.replace(".","");
x = x.replace(",","");
x = x.replace("!","");
x = x.replace("?","");
x = x.replace("\"","");
x = x.replace("-","");
return x;
}
//主方法
public static void main(String[] args) {
System.out.println("WaterMa--------te\".dadad!?ffiuo\"");
System.out.println(DeleteString("WaterMate.dadad!?ffiuo\""));
}
}
//如下是第二个程序的 StringManager.java 文件
package src; public class StringManager {
//======================<数据域>=======================//
//单词
private String string;
//出现次数
private int num;
//======================<方法域>=======================//
//string的Set、Get方法
public void setString(String str){
string = str;
}
public String getString(){
return string;
}
//num的Set、Get方法
public void setNum(int nums){
num = nums;
}
public int getNum(){
return num;
}
//次数++
public void add(){
num++;
}
public void add(int n){
num = num + n;
}
//打印方法
public void Print(){
System.out.println(string+" : "+num);
}
//构造方法
public StringManager(){
num = 0;
string = null;
}
public StringManager(String str){
num = 0;
string = str;
}
public StringManager(String str,int times){
num = times;
string = str;
}
//主方法
public static void main(String[] args) { }
}
//如下是第二个程序的
package src; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner; public class StringDate {
//======================<数据域>=======================//
//数据库
private StringManager []date = null;
//长度
private int length;
//最大容量
private int MaxSize;
//======================<方法域>=======================//
//基础方法
public void SetLength(int l){
length = l;
}
public int GetLength(){
return length;
}
public void SetDate(int seat,String str,int times){
date[seat].setNum(times);
date[seat].setString(str);
}
public void SetDate(int seat,StringManager a){
date[seat].setNum(a.getNum());
date[seat].setString(a.getString());
}
public StringManager GetDate(int seat){
return date[seat];
}
//判断数据库内部是否已满
public boolean isfull(){
return length==MaxSize;
}
//判断数据库内部是否为空
public boolean isempty(){
return length==0;
}
//计算总数
public int Sum(){
int sum = 0;
for(int i=0;i<length;i++)
sum = sum + date[i].getNum();
return sum;
}
//计算概率
public double pointValue(int seat){
return (double)date[seat].getNum()/(double)Sum();
}
//打印次数
public void Printnum(int seat){
System.out.println(date[seat].getString()+" : "+date[seat].getNum());
}
public void Printnum(){
for(int i=0;i<length;i++)
Printnum(i);
}
//打印概率
public void PrintpointValue(int seat){
System.out.println(date[seat].getString()+" : "+pointValue(seat)*100+"%");
}
public void PrintpointValue(){
for(int i=0;i<length;i++)
PrintpointValue(i);
}
//添加一个字符串
public void AddString(String str){
str = StringBasic.ToSmall(str);
str = StringBasic.DeleteString(str);
if(str.compareTo("")==0)
return;
else
{
if(HaveTheString(str))
{
date[SearchString(str)].add();
}
else
{
if(length==MaxSize)
{
System.out.println("OverFlow!");
return;
}
else
{
date[length].setNum(1);
date[length].setString(str);
length++;
}
}
}
}
//从数据库里寻找是否存在该字符串
public boolean HaveTheString(String str){
for(int i=0;i<length;i++)
if(date[i].getString().compareTo(str)==0)
return true;
return false;
}
//从数据库里寻找该字符串的位置
public int SearchString(String str){
for(int i=0;i<length;i++)
if(date[i].getString().compareTo(str)==0)
return i;
return -1;
}
//从文件里导入
public void BuildFromFile(String fileName){
try {
Scanner sc = new Scanner (new FileReader(fileName));
String str = sc.next();
for(;str.compareTo("")!=0&&sc.hasNext();str = sc.next())
{
AddString(str);
}
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
//构造方法
public StringDate(){
MaxSize = 0;
length = 0;
date = new StringManager[0];
}
public StringDate(int max){
MaxSize = max;
length = 0;
date = new StringManager[max];
for(int i=0;i<max;i++)
date[i] = new StringManager();
}
//打印前 N 名的次数
public void PrintStringInNo(int N){
String [] str = new String [N];
int [] Number = new int [N];
for(int i=0;i<N;i++)
Number[i] = 0;
for(int i=0;i<length;i++)
{
for(int k=0;k<N;k++)
if(date[i].getNum()>Number[k])
{
for(int j=N-1;j>k;j--)
{
Number[j] = Number[j-1];
str[j] = str [j-1];
}
str[k] = date[i].getString();
Number[k] = date[i].getNum();
break;
}
}
for(int i=0;i<N;i++)
System.out.println(str[i]+" : "+Number[i]);
}
//打印前 N 名的次数
public void PrintStringInNo(int N,String fileName){
String [] str = new String [N];
int [] Number = new int [N];
for(int i=0;i<N;i++)
Number[i] = 0;
for(int i=0;i<length;i++)
{
for(int k=0;k<N;k++)
if(date[i].getNum()>Number[k])
{
for(int j=N-1;j>k;j--)
{
Number[j] = Number[j-1];
str[j] = str [j-1];
}
str[k] = date[i].getString();
Number[k] = date[i].getNum();
break;
}
}
File f = new File(fileName);
if(!f.exists())
{
try {
f.createNewFile();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
try {
PrintWriter pw = new PrintWriter(new FileWriter(fileName));
for(int i=0;i<N;i++)
{
pw.println(str[i]+" : "+Number[i]);
}
pw.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
//主方法
public static void main(String[] args) {
StringDate sd = new StringDate(10000);
sd.BuildFromFile("files/Harry Potter.txt");
sd.PrintStringInNo(5,"files/answer.txt");
}
}
StringDate.java 文件
Java的实验程序之输出单个文件中的前 N 个最常出现的英语单词的更多相关文章
- 输出单个文件中的前 N 个最常出现的英语单词,并将结果输入到文本文件中。程序设计思路。
将文件内容读取后存入StringBuffer中. 利用函数将段落分割成字符串,按(“,”,“.”,“!”,“空格”,“回车”)分割,然后存入数组中. 遍历数组,并统计每个单词及其出现的次数. 要求出文 ...
- windows cmd.exe 将程序 stdout 输出到文件中
问题背景:通过 cmd.exe 调用程序,会有一些输出信息,在 cmd 中不方便查阅,所以需要导入文件中. 例如 方法: 可以在其路径下看到
- IDEA 之 ERROR:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]
问题描述:在使用IDEA对JSTL进行测试时出现error:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core] ...
- ios 将Log日志重定向输出到文件中保存
对于真机,日志没法保存,不好分析问题.所以有必要将日志保存到应用的Docunment目录下,并设置成共享文件,这样才能取出分析. 首先是日志输出,分为c的printf和标准的NSLog输出,print ...
- spark SQL读取ORC文件从Driver启动到开始执行Task(或stage)间隔时间太长(计算Partition时间太长)且产出orc单个文件中stripe个数太多问题解决方案
1.背景: 控制上游文件个数每天7000个,每个文件大小小于256M,50亿条+,orc格式.查看每个文件的stripe个数,500个左右,查询命令:hdfs fsck viewfs://hadoop ...
- 将windows控制台内容输出到文件中
将windows控制台内容输出到文件中 dir>c:/file.txt 2>&1 对应的java class >c:/file.txt 2>&1 ...
- 【转】【整理】将Linux脚本中的正常输出,警告,错误等信息输出到文件中
本文来自:http://blog.csdn.net/woshinia/article/details/18040063 很早以前 编译的时候 就在用 2>&1,但是一直没有生成一 ...
- 将Linux下编译的warning警告信息输出到文件中[整理笔记]
Linux中,脚本语言环境中,即你用make xxx即其他一些普通linux命令,比如ls,find等,不同的数字,代表不同的含义: 数字 含义 标准叫法0 标准输入 stdin = standar ...
- shell编程学习笔记(七):Shell中将指定内容输出到文件中
我们这里把echo要打印的内容输出到文件中 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/scripts # vim script06.sh 开始编写script ...
随机推荐
- luogu P4770 [NOI2018]你的名字
传送门 upd 19.4.24: WC这个做法真的有问题,不往回跳会WA是因为一开始跳到了S[1...l-1]所对应的点,然后往后接字符的时候可能会因为不在正确的endpos中,然后往回跳过头,其实一 ...
- 安装Vmware并破解
1. 先下载Vmware安装包 链接:http://pan.baidu.com/s/1hsjCKgk 密码:c1o6 2. 解压缩 3. 运行VMware-workstation-full-10.0. ...
- Git命令执行漏洞
Git命令造成的反弹shell 漏洞描述: Git LFS可以.lfsconfig使用LFS由存储库中的文件配置(部分),并且可以将Git LFS指向ssh://. [lfs] url = ssh:/ ...
- java语言什么时候诞生的?
java语言什么时候诞生的?创始人是谁?何时发布的? Java编程语言是sun Microsystems公司JamesGosling在1990年创建的1995年公布于世
- Css - 页面标签页图标
Css - 页面标签页图标 <head> <meta charset="utf-8" /> <title>京东(JD.COM)- ...
- Zookeeper学习笔记4
开源客户端 ZkClient <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId ...
- P1456 Monkey King
题目地址:P1456 Monkey King 一道挺模板的左偏树题 不会左偏树?看论文打模板,完了之后再回来吧 然后你发现看完论文打完模板之后就可以A掉这道题不用回来了 细节见代码 #include ...
- python 各种推导式玩法
推导式套路 除了最简单的列表推导式和生成器表达式,其实还有字典推导式.集合推导式等等. 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式. variable = [out_exp_re ...
- ajax跨域请求 Uncaught SyntaxError: Unexpected token :
最近使用前后端分离开发项目比较多,经常碰到的一个问题就是,前端静态页面请求,后端api获取数据,很多时候,前端和后端都不是在同一个域下的(协议,域名,端口). 这里使用的是ajax请求,因为浏览器的同 ...
- SPI总线协议及SPI时序图详解【转】
转自:https://www.cnblogs.com/adylee/p/5399742.html SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接 ...