日期:2018.10.11
星期四
博客期:016
题目:输出单个文件中的前 N 个最常出现的英语单词,并输出到文本文件中
在程序运行之前,我试着先写了字符的字母的总结,加载代码如下:
1 //如下是第一个程序的 CharBasic文件
2 package src;
3
4 public final class CharBasic {
5 //检测字母是否为字母
6 public static boolean isAtoZ(char c){
7 return c<='z'&&c>='A';
8 }
9 //检测字母是否为大写
10 public static boolean isBig(char c){
11 return c>='A'&&c<='Z';
12 }
13 //检测字母是否为小写
14 public static boolean isSmall(char c){
15 return c>='a'&&c<='z';
16 }
17 //转换字符的大小写
18 public static char ChangeBigSmall(char c){
19 if(CharBasic.isBig(c))
20 return (char)(c+'a'-'A');
21 else if(CharBasic.isSmall(c))
22 return (char)(c+'A'-'a');
23 else
24 return '\0';
25 }
26 //int与char的"类型"转换
27 public static char Changeintchar(int x){
28 return (char)('0'+x);
29 }
30 public static int Changeintchar(char c){
31 return (char)(c-'0');
32 }
33 //主方法
34 public static void main(String[] args) {
35
36 }
37 }
1 //如下是第一个程序的 CharManager.java 文件
2 package src;
3
4 public class CharManager {
5 //字符
6 private char cha;
7 //次数
8 private int num;
9 //cha的set、get方法
10 public void setcha(char chas){
11 cha = chas;
12 }
13 public char getcha(){
14 return cha;
15 }
16 //num的set、get方法
17 public void setnum(int nums){dda
18 num = nums;
19 }
20 public int getnum(){
21 return num;
22 }
23 //num的++方法
24 public void add(){
25 num++;
26 }
27 public void add(int n){
28 num = num + n;
29 }
30 //打印方法
31 public void Print(){
32 System.out.println(cha+"\t"+num);
33 }
34 //构造方法
35 public CharManager(){
36 num = 0;
37 cha = ' ';
38 }
39 public CharManager(char t){
40 num = 0;
41 cha = t;
42 }
43 public static void main(String[] args) {
44 CharManager t = new CharManager('f');
45 t.add();
46 t.setcha('A');
47 }
48 }
1 //如下是第一个程序的 CharDate.java 文件
2 package src;
3
4 import java.io.FileNotFoundException;
5 import java.io.FileReader;
6 import java.util.Scanner;
7
8 public class CharDate {
9 //============================================<数据域>=============================================//
10 //字符数据库
11 private CharManager []date = null;
12 //确定长度
13 private int length;
14 //最大长度
15 private int MaxSize;
16 //============================================<方法域>=============================================//
17 //基础设置方法
18 public void SetLength(int l){
19 length = l;
20 }
21 public int GetLength(){
22 return length;
23 }
24 public void SetManger(int seat,char value,int times){
25 date[seat].setcha(value);
26 date[seat].setnum(times);
27 }
28 public void SetManger(int seat,CharManager a){
29 date[seat].setcha(a.getcha());
30 date[seat].setnum(a.getnum());
31 }
32 public CharManager GetManger(int seat){
33 return date[seat];
34 }
35 //判断数据库内部是否已满
36 public boolean isfull(){
37 return length==MaxSize;
38 }
39 //判断数据库内部是否为空
40 public boolean isempty(){
41 return length==0;
42 }
43 //判断数据库内部是否含有c字符
44 public boolean havethechar(char c){
45 for(int i=0;i<length;++i)
46 if(c==date[i].getcha())
47 return true;
48 return false;
49 }
50 //返回数据库内部字符c的位置
51 public int SearchSeat(char c){
52 for(int i=0;i<length;++i)
53 if(c==date[i].getcha())
54 return i;
55 return -1;
56 }
57 //对新字母进行处理
58 public void DealWithAtoZ(char c,boolean identifybigorsmall){
59 if(CharBasic.isAtoZ(c))
60 {
61 if(!identifybigorsmall)
62 {
63 if(havethechar(c))
64 date[SearchSeat(c)].add();
65 else if(havethechar(CharBasic.ChangeBigSmall(c)))
66 date[SearchSeat(CharBasic.ChangeBigSmall(c))].add();
67 else
68 {
69 if(length<MaxSize)
70 {
71 date[length].setcha(CharBasic.isSmall(c)?c:CharBasic.ChangeBigSmall(c));
72 date[length].setnum(1);
73 length++;
74 }
75 else
76 {
77 System.out.println("OverFlow!");
78 return;
79 }
80 }
81 }
82 else
83 {
84 if(havethechar(c))
85 date[SearchSeat(c)].add();
86 else
87 {
88 if(length<MaxSize)
89 {
90 date[length].setcha(c);
91 date[length].setnum(1);
92 length++;
93 }
94 else
95 {
96 System.out.println("OverFlow!");
97 return;
98 }
99 }
100 }
101 }
102 else
103 {
104 System.out.println("Not A to Z!");
105 return;
106 }
107 }
108 public void DealWithHavedAtoZ(char c,boolean identifybigorsmall){
109 if(CharBasic.isAtoZ(c))
110 {
111 if(!identifybigorsmall)
112 {
113 if(havethechar(c))
114 date[SearchSeat(c)].add();
115 else if(havethechar(CharBasic.ChangeBigSmall(c)))
116 date[SearchSeat(CharBasic.ChangeBigSmall(c))].add();
117 }
118 else
119 {
120 date[SearchSeat(c)].add();
121 }
122 }
123 else
124 {
125 System.out.println("Not A to Z!");
126 return;
127 }
128 }
129 //计算总数
130 public int Sum(){
131 int sum = 0;
132 for(int i=0;i<length;i++)
133 sum = sum + date[i].getnum();
134 return sum;
135 }
136 //计算概率
137 public double pointValue(int seat){
138 return (double)date[seat].getnum()/(double)Sum();
139 }
140 //打印次数
141 public void Printnum(int seat){
142 System.out.println(date[seat].getcha()+" : "+date[seat].getnum());
143 }
144 public void Printnum(){
145 for(int i=0;i<length;i++)
146 System.out.println(date[i].getcha()+" : "+date[i].getnum());
147 }
148 //打印概率
149 public void PrintpointValue(int seat){
150 System.out.println(date[seat].getcha()+" : "+pointValue(seat)*100+"%");
151 }
152 public void PrintpointValue(){
153 for(int i=0;i<length;i++)
154 System.out.println(date[i].getcha()+" : "+pointValue(i)*100+"%");
155 }
156 //从文件导入
157 public void BuildFromFile(String fileName){
158 try {
159 char []temp;
160 Scanner sc = new Scanner(new FileReader(fileName));
161 String string = sc.next();
162 temp = string.toCharArray();
163 for(int i=0;i<temp.length;i++)
164 DealWithHavedAtoZ(temp[i],true);
165 } catch (FileNotFoundException e) {
166 // TODO 自动生成的 catch 块
167 e.printStackTrace();
168 }
169 }
170 //构造方法
171 public CharDate(){
172 MaxSize = 0;
173 length = 0;
174 date = new CharManager [0];
175 }
176 public CharDate(int max){
177 MaxSize = max;
178 length = 0;
179 date = new CharManager [max];
180 for(int i=0;i<max;i++)
181 date[i] = new CharManager();
182 }
183 public CharDate(boolean identifybigorsmall){
184 if(identifybigorsmall)
185 {
186 MaxSize = 52;
187 length = 52;
188 date = new CharManager [52];
189 for(int i=0;i<52;i++){
190 date[i] = new CharManager((char)((int)'A'+i));
191 }
192 }
193 else
194 {
195 MaxSize = 26;
196 length = 26;
197 date = new CharManager [26];
198 for(int i=0;i<26;i++){
199 date[i] = new CharManager((char)((int)'a'+i));
200 }
201 }
202 }
203 //主方法
204 public static void main(String[] args) {
205 CharDate cd = new CharDate(false);
206 cd.BuildFromFile("files/save.txt");
207 cd.Printnum();
208 }
209 }
大致上就是如此,其中问题还是遇到了好多的!比如说一开始我没想大小写转化的情况,那个添加载入一个字符的方法,一开始只有判断一个字符是否存在,再然后就可以执行操作了,但实际上加入大小写不区分后,就需要多加一个参数 ifidentifybigorsmall(是否区分大小写),以及多了一重判断!再加上这个参数的判断,以及多加上操作——对两个字符的分别操作!
再说说本来要做的程序吧!这个就比字符麻烦多了!......呃,其实...吧!也没麻烦多少啊!多加了几个方法,多了几个判断!差不多就写出来了!先说,说完我在展示我的代码!谈到这个String和char[]进行转换也遇到了一些小问题!首先就是那个方法String.toCharArray();这是将字符串大类转成字符数组的方法!利用String的辅助类StringBuffer类来完成一些操作,比如利用delete(0,1);来删除第一位置的字符,用insert(0,char x);来在字符的第一位置存入新的字符,这样就可以把首字母大写的字符串改过来,改成全小写的字符串!再者就是删除字符串的特殊字符——'.'、','、'\“'、'-'等等英文语句内含有的标点符号!再者就是对数据库里的数据处理,找到出现频率排前N名的字符串,至于导出到文件里边就是小case啦!下面写我的代码:
1 //如下是第二个程序的 StringBasic.java 文件
2 package src;
3
4 public class StringBasic {
5 //输出
6 public static void pr(String x){
7 System.out.print(x);
8 }
9 //判断字符串是否为大写字母开头
10 public static boolean isBigFirst(String str){
11 char []br = str.toCharArray();
12 if(br[0]>='A'&&br[0]<='Z')
13 return true;
14 else
15 return false;
16 }
17 //判断字符串是否为大写字母开头
18 public static boolean isSmallFirst(String str){
19 char []br = str.toCharArray();
20 if(br[0]>='a'&&br[0]<='z')
21 return true;
22 else
23 return false;
24 }
25 //将字符串str的开头字符转为小写
26 public static String ChangeToSmall(String str){
27 StringBuffer sb = new StringBuffer(str);
28 char s = sb.charAt(0);
29 if(!StringBasic.isBigFirst(str))
30 return "\0";
31 sb.delete(0,1);
32 s = (char)(s-'S'+'s');
33 sb.insert(0,s);
34 return sb.toString();
35 }
36 //字符串全转小写
37 public static String ToSmall(String x){
38 return x.toLowerCase();
39 }
40 //字符串全转大写
41 public static String ToBig(String x){
42 return x.toUpperCase();
43 }
44 //字符串删除标点符号
45 public static String DeleteString(String x){
46 x = x.replace(".","");
47 x = x.replace(",","");
48 x = x.replace("!","");
49 x = x.replace("?","");
50 x = x.replace("\"","");
51 x = x.replace("-","");
52 return x;
53 }
54 //主方法
55 public static void main(String[] args) {
56 System.out.println("WaterMa--------te\".dadad!?ffiuo\"");
57 System.out.println(DeleteString("WaterMate.dadad!?ffiuo\""));
58 }
59 }
1 //如下是第二个程序的 StringManager.java 文件
2 package src;
3
4 public class StringManager {
5 //======================<数据域>=======================//
6 //单词
7 private String string;
8 //出现次数
9 private int num;
10 //======================<方法域>=======================//
11 //string的Set、Get方法
12 public void setString(String str){
13 string = str;
14 }
15 public String getString(){
16 return string;
17 }
18 //num的Set、Get方法
19 public void setNum(int nums){
20 num = nums;
21 }
22 public int getNum(){
23 return num;
24 }
25 //次数++
26 public void add(){
27 num++;
28 }
29 public void add(int n){
30 num = num + n;
31 }
32 //打印方法
33 public void Print(){
34 System.out.println(string+" : "+num);
35 }
36 //构造方法
37 public StringManager(){
38 num = 0;
39 string = null;
40 }
41 public StringManager(String str){
42 num = 0;
43 string = str;
44 }
45 public StringManager(String str,int times){
46 num = times;
47 string = str;
48 }
49 //主方法
50 public static void main(String[] args) {
51
52 }
53 }
1 //如下是第二个程序的
2 package src;
3
4 import java.io.File;
5 import java.io.FileNotFoundException;
6 import java.io.FileReader;
7 import java.io.FileWriter;
8 import java.io.IOException;
9 import java.io.PrintWriter;
10 import java.util.Scanner;
11
12 public class StringDate {
13 //======================<数据域>=======================//
14 //数据库
15 private StringManager []date = null;
16 //长度
17 private int length;
18 //最大容量
19 private int MaxSize;
20 //======================<方法域>=======================//
21 //基础方法
22 public void SetLength(int l){
23 length = l;
24 }
25 public int GetLength(){
26 return length;
27 }
28 public void SetDate(int seat,String str,int times){
29 date[seat].setNum(times);
30 date[seat].setString(str);
31 }
32 public void SetDate(int seat,StringManager a){
33 date[seat].setNum(a.getNum());
34 date[seat].setString(a.getString());
35 }
36 public StringManager GetDate(int seat){
37 return date[seat];
38 }
39 //判断数据库内部是否已满
40 public boolean isfull(){
41 return length==MaxSize;
42 }
43 //判断数据库内部是否为空
44 public boolean isempty(){
45 return length==0;
46 }
47 //计算总数
48 public int Sum(){
49 int sum = 0;
50 for(int i=0;i<length;i++)
51 sum = sum + date[i].getNum();
52 return sum;
53 }
54 //计算概率
55 public double pointValue(int seat){
56 return (double)date[seat].getNum()/(double)Sum();
57 }
58 //打印次数
59 public void Printnum(int seat){
60 System.out.println(date[seat].getString()+" : "+date[seat].getNum());
61 }
62 public void Printnum(){
63 for(int i=0;i<length;i++)
64 Printnum(i);
65 }
66 //打印概率
67 public void PrintpointValue(int seat){
68 System.out.println(date[seat].getString()+" : "+pointValue(seat)*100+"%");
69 }
70 public void PrintpointValue(){
71 for(int i=0;i<length;i++)
72 PrintpointValue(i);
73 }
74 //添加一个字符串
75 public void AddString(String str){
76 str = StringBasic.ToSmall(str);
77 str = StringBasic.DeleteString(str);
78 if(str.compareTo("")==0)
79 return;
80 else
81 {
82 if(HaveTheString(str))
83 {
84 date[SearchString(str)].add();
85 }
86 else
87 {
88 if(length==MaxSize)
89 {
90 System.out.println("OverFlow!");
91 return;
92 }
93 else
94 {
95 date[length].setNum(1);
96 date[length].setString(str);
97 length++;
98 }
99 }
100 }
101 }
102 //从数据库里寻找是否存在该字符串
103 public boolean HaveTheString(String str){
104 for(int i=0;i<length;i++)
105 if(date[i].getString().compareTo(str)==0)
106 return true;
107 return false;
108 }
109 //从数据库里寻找该字符串的位置
110 public int SearchString(String str){
111 for(int i=0;i<length;i++)
112 if(date[i].getString().compareTo(str)==0)
113 return i;
114 return -1;
115 }
116 //从文件里导入
117 public void BuildFromFile(String fileName){
118 try {
119 Scanner sc = new Scanner (new FileReader(fileName));
120 String str = sc.next();
121 for(;str.compareTo("")!=0&&sc.hasNext();str = sc.next())
122 {
123 AddString(str);
124 }
125 } catch (FileNotFoundException e) {
126 // TODO 自动生成的 catch 块
127 e.printStackTrace();
128 }
129 }
130 //构造方法
131 public StringDate(){
132 MaxSize = 0;
133 length = 0;
134 date = new StringManager[0];
135 }
136 public StringDate(int max){
137 MaxSize = max;
138 length = 0;
139 date = new StringManager[max];
140 for(int i=0;i<max;i++)
141 date[i] = new StringManager();
142 }
143 //打印前 N 名的次数
144 public void PrintStringInNo(int N){
145 String [] str = new String [N];
146 int [] Number = new int [N];
147 for(int i=0;i<N;i++)
148 Number[i] = 0;
149 for(int i=0;i<length;i++)
150 {
151 for(int k=0;k<N;k++)
152 if(date[i].getNum()>Number[k])
153 {
154 for(int j=N-1;j>k;j--)
155 {
156 Number[j] = Number[j-1];
157 str[j] = str [j-1];
158 }
159 str[k] = date[i].getString();
160 Number[k] = date[i].getNum();
161 break;
162 }
163 }
164 for(int i=0;i<N;i++)
165 System.out.println(str[i]+" : "+Number[i]);
166 }
167 //打印前 N 名的次数
168 public void PrintStringInNo(int N,String fileName){
169 String [] str = new String [N];
170 int [] Number = new int [N];
171 for(int i=0;i<N;i++)
172 Number[i] = 0;
173 for(int i=0;i<length;i++)
174 {
175 for(int k=0;k<N;k++)
176 if(date[i].getNum()>Number[k])
177 {
178 for(int j=N-1;j>k;j--)
179 {
180 Number[j] = Number[j-1];
181 str[j] = str [j-1];
182 }
183 str[k] = date[i].getString();
184 Number[k] = date[i].getNum();
185 break;
186 }
187 }
188 File f = new File(fileName);
189 if(!f.exists())
190 {
191 try {
192 f.createNewFile();
193 } catch (IOException e) {
194 // TODO 自动生成的 catch 块
195 e.printStackTrace();
196 }
197 }
198 try {
199 PrintWriter pw = new PrintWriter(new FileWriter(fileName));
200 for(int i=0;i<N;i++)
201 {
202 pw.println(str[i]+" : "+Number[i]);
203 }
204 pw.close();
205 } catch (IOException e) {
206 // TODO 自动生成的 catch 块
207 e.printStackTrace();
208 }
209 }
210 //主方法
211 public static void main(String[] args) {
212 StringDate sd = new StringDate(10000);
213 sd.BuildFromFile("files/Harry Potter.txt");
214 sd.PrintStringInNo(5,"files/answer.txt");
215 }
216 }
217 StringDate.java 文件