今天做的课堂测试是将一篇英文文章中的单词、字母得个数以及百分比所输出出来。
对此我的想法是:统计字母则比较简单。
1、用bufferreader实现读取文本文件。
2、对读取到的一行文件进行转存到字符数组中去。
3、在经过判断进行相关的加和。
//统计文章中的字母次数 package Word; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.text.DecimalFormat; public class WordFind { public static void main(String[] args) { WordFind2[] word=new WordFind2[100]; for(int i=0;i<100;i++) { word[i]=new WordFind2(); } word[0].input(word); word[0].showAsc(word); } } class WordFind2{ private char word; private int num; private static double time=0; public WordFind2() { word='0'; num=1; } public static double getTime() { return time; } public char getWord() { return word; } public void setWord(char word) { this.word = word; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public void addnum() { num++; } public void input(WordFind2[] word) { String str; try { BufferedReader in=new BufferedReader(new FileReader("word.txt")); while((str = in.readLine())!=null) { change(str,word); } in.close(); } catch (IOException e) { System.out.println("缓冲区错误"); } } private void change(String str, WordFind2[] word2) { char[] s1=str.toCharArray(); for(int i=0,j=0;i<s1.length;i++) { if((s1[i]>=65&&s1[i]<=90)||(s1[i]>=97&&s1[i]<=122)) { add(s1[i],word2); time++; } } } private void add(char s, WordFind2[] word2) { int j=0; boolean f=false; for(int i=0;i<word2.length;i++) { if(word2[i].getWord()=='0') {f=true;j=i;break;} if(s==word2[i].getWord()) {word2[i].addnum();break;} } if(f==true) { word2[j]=new WordFind2(); word2[j].setWord(s); } } void show(WordFind2[] word2) { DecimalFormat df = new DecimalFormat( "0.0000"); double b=0; for(int i=0;word2[i].getWord()!='0';i++) { b=word2[i].getNum()/word2[i].getTime(); System.out.println(word2[i].getWord()+" "+df.format(b)); } } void showAsc(WordFind2[] word2) { WordFind2 word=new WordFind2(); for(int i=0;word2[i].getWord()!='0';i++) { //if(word2[i].getWord().equals("")) continue; for(int j=i+1;word2[j].getWord()!='0';j++) { if(word2[i].getNum()<word2[j].getNum()) { word.setWord(word2[i].getWord()); word.setNum(word2[i].getNum()); word2[i].setWord(word2[j].getWord()); word2[i].setNum(word2[j].getNum()); word2[j].setWord(word.getWord()); word2[j].setNum(word.getNum()); } } } for(int i=0;word2[i].getWord()!='0';i++) { //if(word2[i].getWord().equals(""))continue; System.out.println(word2[i].getWord()+" "+word2[i].getNum());// } } }
字母的相对要简单一些,而单词得我得想法是:
1、也是先将文本以行为基础进行读取。
2、在在一行的基础上,进行空格的以及标点符号得判断,之后进行单词的读取。
3、进行单词的查重以及加和。
//统计文章中的单词中的次数 package Word; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.text.DecimalFormat; public class Code { public static void main(String[] args) { String[] del_word=new String[99999]; WordFind3[] word=new WordFind3[999999]; for(int i=0;i<word.length;i++) { word[i]=new WordFind3(); } word[0].input(del_word); word[0].input(word); word[0].showAsc(word); } } class WordFind3{ private String word; private double num; private static double time=0; public WordFind3() { word=null; num=1; } public static double getTime() { return time; } public static void setTime(double time) { WordFind3.time = time; } public String getWord() { return word; } public void setWord(String word) { this.word = word; } public double getNum() { return num; } public void setNum(double num) { this.num = num; } public void addnum() { num++; } public void input(WordFind3[] word) { String str; try { BufferedReader in=new BufferedReader(new FileReader("word.txt")); while((str = in.readLine())!=null) { change(str,word); } in.close(); } catch (IOException e) { System.out.println("缓冲区错误"); } } public void input(String [] del_word) { String str; try { BufferedReader in=new BufferedReader(new FileReader("word.txt")); while((str = in.readLine())!=null) { } in.close(); } catch (IOException e) { System.out.println("缓冲区错误"); } } private void change(String str, WordFind3[] word2) { char[] s1=str.toCharArray(); String str1=null; int star=0,end=0; boolean f=false; for(int i=0;i<s1.length;i++) { if((s1[i]>90&&s1[i]<97)||s1[i]<65||s1[i]>122) { if(star==0&&end==0) { star=i; continue; } else { end=i; } if(star==0)continue; //System.out.println(star+" "+end); str1=str.substring(star+1,end); time++; add(str1,word2); star=end; } } } private void add(String s, WordFind3[] word2) { int j=0; boolean f=false; for(int i=0;i<word2.length;i++) { if(word2[i].getWord()==null) {f=true;j=i;break;} if(word2[i].getWord().equals(s)) {word2[i].addnum();break;} } if(f==true) { word2[j]=new WordFind3(); word2[j].setWord(s); word2[j].setNum(1); } } void show(WordFind3[] word2) { DecimalFormat df = new DecimalFormat( "0.0000"); double b=0; for(int i=0;word2[i].getWord()!=null;i++) { if(word2[i].getWord().equals("")) { word2[i].setTime(word2[i].getTime()-word2[i].getNum()); } } for(int i=0;word2[i].getWord()!=null;i++) { if(word2[i].getWord().equals(""))continue; b=word2[i].getNum()/word2[i].getTime(); //百分数字输出 System.out.println(word2[i].getWord()+" "+word2[i].getNum());// } } public void showAsc(WordFind3[] word2) { WordFind3 word=new WordFind3(); for(int i=0;word2[i].getWord()!=null;i++) { //if(word2[i].getWord().equals("")) continue; for(int j=i+1;word2[j].getWord()!=null;j++) { if(word2[i].getNum()<word2[j].getNum()) { word.setWord(word2[i].getWord()); word.setNum(word2[i].getNum()); word2[i].setWord(word2[j].getWord()); word2[i].setNum(word2[j].getNum()); word2[j].setWord(word.getWord()); word2[j].setNum(word.getNum()); } } } for(int i=0;word2[i].getWord()!=null;i++) { if(word2[i].getWord().equals(""))continue; System.out.println(word2[i].getWord()+" "+word2[i].getNum());// } } public void showAsc(WordFind3[] word2, int n2) { WordFind3 word=new WordFind3(); for(int i=0;word2[i].getWord()!=null;i++) { //if(word2[i].getWord().equals("")) continue; for(int j=i+1;word2[j].getWord()!=null;j++) { if(word2[i].getNum()<word2[j].getNum()) { word.setWord(word2[i].getWord()); word.setNum(word2[i].getNum()); word2[i].setWord(word2[j].getWord()); word2[i].setNum(word2[j].getNum()); word2[j].setWord(word.getWord()); word2[j].setNum(word.getNum()); } } } for(int i=0;word2[i].getWord()!=null&&i<n2;i++) { if(word2[i].getWord().equals("")) {continue;} System.out.println(word2[i].getWord()+" "+word2[i].getNum());// } } }
但是我的程序还是有着一些的缺陷,就是排序的方法采用的冒泡排序,空间复杂度、时间复杂度都相对较高,我想在之后实现将数据存储到李斯特容器中,在用容器进行相关的排序操作。