日期: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 文件