统计英语文章的单词
今天的工程项目作业是输出一篇英语文章中前N个最常出现的英语单词,并将结果输入到文本文件中。
看到这题后,我首先按照老师讲课的内容将这个程序分成一个又一个模块:
1.实现文件的输出;
2.对输出的内容进行统计;//可以分的更多
3.将结果输入到文件中。
文件的输入输出通过BufferedWriter、BufferedReader实现,运用exists判断文件打开是否成功,如果失败则创建文件。把文件的输出单独作为一个函数,来确定文件的输出是否成功。这个项目最难的地方是对单词进行统计,这个地方我是通过借鉴了他人的程序实现的,首先是通过正则表达式匹配单词,之后通过映射统计单词出现的次数,通过Collections中的sort对单词出现的次数进行排序。通过这个作业,我认识到了自己的不足,太长时间为未用java编程导致有些生疏,平常训练不够,对java的很多方法掌握的不够多。也收获了很多,巩固了java文件的输入输出,知道了很多java的新方法,学习了正则表达式的定义以及java的映射,学习了Collections。这次的作业大部分是看了别人的代码,在下次作业时,我要靠自己的能力完成。
collections:
使用sort方法可以根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此列表内的所有元素都必须是使用指定比较器可相互比较的 。
import java.io.*; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Statistics { public static String Init(String fileName) //输出文件中的内容 { String S=null; File file=new File(fileName); if(file.exists()) { if(file.isFile()) { try { BufferedReader input=new BufferedReader(new FileReader(file)); StringBuffer buffer = new StringBuffer(); String text; while((text = input.readLine()) != null) buffer.append(text +""); S = buffer.toString(); }catch(IOException ioException){ System.err.println("File Error!"); } } } return S; } public static void count(String str) throws IOException { Pattern expression = Pattern.compile("[a-zA-Z]+");//定义正则表达式匹配单词 Matcher matcher = expression.matcher(str); Map<String,Integer> map=new HashMap<String,Integer>(); String word = ""; int n = 0; Integer times = 0; while(matcher.find())//是否匹配单词 { word = matcher.group();//得到一个单词,树映射中的键 n++; if( map.containsKey(word) ) { times = map.get(word); map.put(word, times+1); } else { map.put(word, 1); } } List<Map.Entry<String,Integer>> list=new ArrayList<Map.Entry<String,Integer>>(map.entrySet()); Comparator<Map.Entry<String,Integer>> comparator = new Comparator<Map.Entry<String,Integer>>() { @Override public int compare(Entry<String, Integer> left, Entry<String, Integer> right) { // TODO 自动生成的方法存根 return (left.getValue()).compareTo(right.getValue()); } }; Collections.sort(list, comparator); BufferedWriter bufw = new BufferedWriter(new FileWriter("result.txt"));//将信息输入到文件中 int last=list.size()-1; System.out.println(""); for(int i=last;i>last-5;i--) { bufw.write("key="+list.get(i).getKey()+" value="+list.get(i).getValue()); bufw.newLine(); System.out.println("key="+list.get(i).getKey()+" value="+list.get(i).getValue()); } bufw.close(); } public static void main(String[] args) throws IOException { File file1=new File("stit.txt"); if(!file1.exists())//如果打开失败,创造文件 file1.mkdir(); File file2=new File("result.txt"); if(!file2.exists()) file2.mkdir(); String str = Init("stit.txt"); System.out.print(str); count(str); } }