1 package classtest; 2 //从文件中读取一篇英文文章,并对其中出现的单词进行统计,输出n个频率最高的单词 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileNotFoundException; 7 import java.io.FileWriter; 8 import java.io.IOException; 9 import java.io.InputStreamReader; 10 import java.util.ArrayList; 11 import java.util.HashMap; 12 import java.util.Map; 13 import java.util.Scanner; 14 15 public class Word { 16 static String s = ""; 17 static Scanner in = new Scanner(System.in); 18 19 public static void main(String[] args) throws IOException { 20 // TODO 自动生成的方法存根 21 22 read(); 23 24 File fl = new File("d:\\文件\\单词录入.txt"); 25 FileWriter fw = new FileWriter(fl); 26 //int countspace = 0; //用来统计空格的计数器 27 28 //String[] rang = s.split("\\b");//以空格来划分 29 String[] rang = s.split("[^(a-zA-Z)]+"); //按照字母来划分 30 31 32 Map<String , Integer>map = new HashMap<String , Integer>(); 33 for(String str :rang) 34 { 35 if(str.trim().length()>0) 36 { 37 str = str.trim(); 38 if(!map.containsKey(str)) 39 { 40 41 int count = s.split("[^(a-zA-Z)]+" + str.trim() + "[^(a-zA-Z)]+").length; 42 map.put(str, count); 43 } 44 } 45 /*else { 46 47 map.put("空格", countspace ++); //统计空格个数 48 }*/ 49 } 50 51 52 /* 53 *对未排序钱所统计的结果进行输出 54 for (String key :map.keySet()) 55 { 56 System.out.println(key + "出现" + " " +map.get(key) + "次"); 57 }*/ 58 59 ArrayList<String> list = new ArrayList<String>(); 60 list.addAll(map.keySet()); //将单词添加到list中 61 62 //排序按照出现次数降序排列 63 for(int i = 0;i < list.size();i++) 64 { 65 66 for(int j = 0;j < (list.size() - i-1);j++) //list.size() - i-1因为要用到i+1要考虑是否超出范围的问题 67 { 68 69 if(map.get(list.get(j)) < map.get(list.get(j+1))) 70 { 71 String t = list.get(j); 72 list.set(j, list.get(j+1)); 73 list.set( j+1, t); 74 } 75 } 76 } 77 78 /* 79 * //排序后的输出 80 System.out.println("排序后\n"); 81 for(String str : list) 82 { 83 System.out.println(str + "\t出现\t" + map.get(str) + "次"); 84 } 85 */ 86 int num; 87 System.out.println("请输入所要打印的单词数量"); 88 num = in.nextInt(); 89 for(int i= 0 ;i < num;i++) 90 { 91 System.out.println(list.get(i) + "\t出现\t" + map.get(list.get(i)) + "次"); 92 fw.write(list.get(i) + "\t出现\t" + map.get(list.get(i)) + "次" + "\n"); //将其写入文件 93 94 } 95 96 fw.close(); 97 } 98 99 100 //读取文件的方法 101 public static String read() throws IOException 102 { 103 104 FileInputStream fis = new FileInputStream("d:\\文件\\单词.txt"); 105 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); 106 String temp = ""; 107 while((temp = br.readLine()) != null) 108 s = s + temp + "\n"; //将文件中的文章都存入字符串s中 109 110 fis.close();//关闭文件 111 br.close(); 112 return s; 113 } 114 115 116 } 117 118
这次项目是编写一个可以从文件中读取一篇英文文章,并且对文章中的单词所出现的次数进行统计。
这个程序的主要步骤就是:
1.将文件中的内容导出。
2.将导出的内容进行拆分,将其拆分成单词,并将其储存。
3.对每一个单词出现的次数进行统计。
4.对这些单词根据出现的次数进行排序。
在程序的编写过程中还是遇到了很多的困难,首先我实现了文件的读入,将文件读入到了一个字符串中,但是在拆分的过程中遇到了问题,后来从网上搜索之后找到了拆分的方法,第一次用的函数仅仅是以空格的方式进行拆分的,所以这就造成了将句子中的符号也计算到了单词中,导致排序的时候出现了问题。后来经过修改后将符号删除。