Java的实验程序之输出单个文件中的前 N 个最常出现的英语单词
日期: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 文件