package fengzhuang; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; class Word { String value; int geshu; static Word next; public Word(String value,int geshu) { this.value=value; this.geshu=geshu; next=null; } public Word() { this.value=""; this.geshu=0; next=null; } } public class Ceshi { public static void main(String[] args) { System.out.println("请输入您想完成的功能:"); int i=0; for(int n=1;n<10;n++) {System.out.println("1:统计字母;2:统计单词;3:指定单词"); Scanner scan=new Scanner(System.in); i=scan.nextInt(); if(i==1) { Zimu(); } if(i==2) { try { Quan(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(i==3) { try { Danci(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("是否退出 退出0,不退出-其他"); n=scan.nextInt(); if(n==0) { break; } } } static void Zimu() { try { char shu[] = new char[10000000]; char zimu[] = new char[52]; int j=0; int count[]=new int[52]; String pathname="E:\o1.txt"; File filename=new File(pathname); InputStreamReader reader=new InputStreamReader(new FileInputStream(filename)); BufferedReader br=new BufferedReader(reader); String line[]=new String[100];; for(int i=0;i<line.length;i++){ line[i]=br.readLine(); } br.close(); int k=0; while(line[k]!=null) { for(int i=0;i<line[k].length();i++) { shu[j]=line[k].charAt(i); j++; } k++; } for(int i=0;i<shu.length;i++) { switch(shu[i]) { case 'a':zimu[0]='a';count[0]++;break; case 'b':zimu[1]='b';count[1]++;break; case 'c':zimu[2]='c';count[2]++;break; case 'd':zimu[3]='d';count[3]++;break; case 'e':zimu[4]='e';count[4]++;break; case 'f':zimu[5]='f';count[5]++;break; case 'g':zimu[6]='g';count[6]++;break; case 'h':zimu[7]='h';count[7]++;break; case 'i':zimu[8]='i';count[8]++;break; case 'j':zimu[9]='j';count[9]++;break; case 'k':zimu[10]='k';count[10]++;break; case 'l':zimu[11]='l';count[11]++;break; case 'm':zimu[12]='m';count[12]++;break; case 'n':zimu[13]='n';count[13]++;break; case 'o':zimu[14]='o';count[14]++;break; case 'p':zimu[15]='p';count[15]++;break; case 'q':zimu[16]='q';count[16]++;break; case 'r':zimu[17]='r';count[17]++;break; case 's':zimu[18]='s';count[18]++;break; case 't':zimu[19]='t';count[19]++;break; case 'u':zimu[20]='u';count[20]++;break; case 'v':zimu[21]='v';count[21]++;break; case 'w':zimu[22]='w';count[22]++;break; case 'x':zimu[23]='x';count[23]++;break; case 'y':zimu[24]='y';count[24]++;break; case 'z':zimu[25]='z';count[25]++;break; case 'A':zimu[26]='A';count[26]++;break; case 'B':zimu[27]='B';count[27]++;break; case 'C':zimu[28]='C';count[28]++;break; case 'D':zimu[29]='D';count[29]++;break; case 'E':zimu[30]='E';count[30]++;break; case 'F':zimu[31]='F';count[31]++;break; case 'G':zimu[32]='G';count[32]++;break; case 'H':zimu[33]='H';count[33]++;break; case 'I':zimu[34]='I';count[34]++;break; case 'J':zimu[35]='G';count[35]++;break; case 'K':zimu[36]='K';count[36]++;break; case 'L':zimu[37]='L';count[37]++;break; case 'M':zimu[38]='M';count[38]++;break; case 'N':zimu[39]='N';count[39]++;break; case 'O':zimu[40]='O';count[40]++;break; case 'P':zimu[41]='P';count[41]++;break; case 'Q':zimu[42]='Q';count[42]++;break; case 'R':zimu[43]='R';count[43]++;break; case 'S':zimu[44]='S';count[44]++;break; case 'T':zimu[45]='T';count[45]++;break; case 'U':zimu[46]='U';count[46]++;break; case 'V':zimu[47]='V';count[47]++;break; case 'W':zimu[48]='W';count[48]++;break; case 'X':zimu[49]='X';count[49]++;break; case 'Y':zimu[50]='Y';count[50]++;break; case 'Z':zimu[51]='Z';count[51]++; } } int ci=0; int sum=0; System.out.println("短文中各字母出现情况统计如下:"); for(int i=0;i<52;i++) { if(count[i]!=0) { ci++; sum+=count[i]; System.out.println(ci+".字母"+zimu[i]+"的出现次数是:"+count[i]); } } System.out.println("字母共计:"+sum+"个"); }catch (Exception e) { e.printStackTrace(); } } static void Quan()throws IOException { Word word=new Word(); //单词的链头 Word lian,xin; String str=""; FileReader f=new FileReader("E:\o1.txt"); //读取英文文件 char[] c=new char[1]; //每次读取一个字母 int b=0; boolean exist=false; //判断单词是否存在于 word 链中 while((b=f.read(c))!=-1) //每次读取一个字母直到最后 { //如果字符为 换行、空格、单引号、双引号、逗号、句号 则为一个单词的结束及另一个单词的开始 if(String.valueOf(c).equals(" ")||String.valueOf(c).equals(" ")||String.valueOf(c).equals(" ")||String.valueOf(c).equals(",")||String.valueOf(c).equals(".")||String.valueOf(c).equals(""")||String.valueOf(c).equals("'")) { lian=word; while(lian!=null) { if(lian.value.equalsIgnoreCase(str)) //如果单词在单词链中存在,则单词个数++ { lian.geshu++;exist=true;break; } else { lian=lian.next; } } if(exist==false) //如果不存在,则在单词链中添加 { xin=new Word(str,1); xin.next=word.next; word.next=xin; str=""; } else { exist=false; str=""; } } else //单词 { str+=String.valueOf(c); } } int N=20; for(int i=1;i<=N;i++) { xin=new Word("",0); lian=word.next; //找到单词链中个数最多的 while(lian!=null) { if(lian.geshu>xin.geshu) { xin=lian; } lian=lian.next; } //输出单词链中个数最多的 System.out.println("第"+i+"个 :"+xin.value+"个数:"+xin.geshu); lian=word; //删除单词链中单词个数最多的 while(lian.next!=null) { if(lian.next.value.equalsIgnoreCase(xin.value)) { lian.next=lian.next.next; break; } lian=lian.next; } } } static void Danci()throws IOException { Word word=new Word(); //单词的链头 Word lian,xin; String str=""; FileReader f=new FileReader("E:\o1.txt"); //读取英文文件 char[] c=new char[1]; //每次读取一个字母 int b=0; boolean exist=false; //判断单词是否存在于 word 链中 while((b=f.read(c))!=-1) //每次读取一个字母直到最后 { //如果字符为 换行、空格、单引号、双引号、逗号、句号 则为一个单词的结束及另一个单词的开始 if(String.valueOf(c).equals(" ")||String.valueOf(c).equals(" ")||String.valueOf(c).equals(" ")||String.valueOf(c).equals(",")||String.valueOf(c).equals(".")||String.valueOf(c).equals(""")||String.valueOf(c).equals("'")) { lian=word; while(lian!=null) { if(lian.value.equalsIgnoreCase(str)) //如果单词在单词链中存在,则单词个数++ { lian.geshu++;exist=true;break; } else { if(str.equals("a")||str.equals("the")||str.equals("and")) { break; } lian=lian.next; } } if(exist==false) //如果不存在,则在单词链中添加 { xin=new Word(str,1); xin.next=word.next; word.next=xin; str=""; } else { exist=false; str=""; } } else //单词 { str+=String.valueOf(c); } } // 循环10次 System.out.println("请输入您想查询的前几个出现此处最多的单词"); Scanner scan=new Scanner(System.in); int N=scan.nextInt(); for(int i=1;i<=N;i++) { lian=Word.next; xin=new Word("",0); lian=word.next; //找到单词链中个数最多的 while(lian!=null) { if(lian.geshu>xin.geshu) { xin=lian; } lian=lian.next; } //输出单词链中个数最多的 System.out.println("第"+i+"个 :"+xin.value+"个数:"+xin.geshu); lian=word; //删除单词链中单词个数最多的 while(lian.next!=null) { if(lian.next.value.equalsIgnoreCase(xin.value)) { lian.next=lian.next.next; break; } lian=lian.next; } } } }
(1)设计思路:定义几个数组:
1单词数组,用来存放所有的单词
2长度数组:用来存放从每一个单词开始,单词链的长度
3结果数组:用来存放从每一个单词开始的单词链
用每一个单词查询单词链,并用以上数组保存结果,再从长度数组中提取最大数的下标,输出结果数组该下标对应的字符串即可。
(4)总结:因为在代码中用到了双重循环,会使代码运行时间大大加长,我还没有找到用一层循环就可以得到结果的方法。