java 單詞本-詞頻統計
阿新 • • 發佈:2018-12-11
import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.TreeMap; /*作業要求 * 做一個詞頻統計程式,該程式具有以下功能 基本要求: (1)可匯入任意英文文字檔案 (2)統計該英文檔案中單詞數和各單詞出現的頻率(次數),並能將單詞按字典順序輸出。 (3)將單詞及頻率寫入檔案。 * */ /*@author:kxd * 本人採用Collection集合類的子類TreeMap和StringBuffer 來組織資料 * 利用TreeMap的一致性不能重複 來設定單詞本 重寫compare函式來排序 * 利用HashMap 中的對映便捷的統計次數 * 使用StringBuffer的可變性和強大的類函式來操作單詞, * * */ public class Demo1 { public static void main(String[] args) { // TODO Auto-generated method stub TreeMap<StringBuffer,String > ts = new TreeMap<StringBuffer,String>(new Comparator<StringBuffer>(){ @Override public int compare(StringBuffer sb1,StringBuffer sb2 ) { if(sb1==null&&sb2==null) { return 1; } String str1 = sb1.toString(); String str2 = sb2.toString(); if (str1.compareTo(str2)>0) { return 1; }else if (str1.compareTo(str2)<0) { return -1; }else{//(str1.compareTo(str2)=0) return 0; } } }); StringBuffer sb2= new StringBuffer(); sb2=getFile();//StringBuffer檔案讀入 //單詞擷取 List<String> lists = new ArrayList<String>(); //儲存過濾後單詞的列表 String str2 = sb2.toString(); String[] wordsArr1 = str2.split("[^a-zA-Z]"); //過濾出只含有字母的 for (String word : wordsArr1) { if(word.length() != 0){ //去除長度為0的行 System.out.println(word); lists.add(word); } } for(String str: lists) {//單詞計數加入TreeMap //System.out.print(s1+"="); // System.out.println( hm.get(s1)); StringBuffer s2 = new StringBuffer( str); int cout=1; if (ts.containsKey(s2)) { cout++; ts.put(s2, Integer.toString(cout)); }else { ts.put(s2, Integer.toString(cout)); } } Set<StringBuffer> ks1 = ts.keySet();//遍歷TreeMap for(StringBuffer s2:ks1) { System.out.println("單詞:"+s2.toString()+" 出現次數:"+ts.get(s2)); try { setFile ("單詞:"+s2.toString()+" 出現次數:"+ts.get(s2)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("檔案成功讀入到指定路徑下");// } // sadsfsafas saasfsa sdasdsad sdsadsadas public static StringBuffer getFile () { //檔案讀入函式 String str=null;//定義一個字串型別變數str StringBuffer sb1= new StringBuffer(); try {//try程式碼塊,當發生異常時會轉到catch程式碼塊中 //讀取指定的檔案 BufferedReader in = new BufferedReader(new FileReader("C:\\Users\\Administrator\\Desktop\\2018下學期作業\\程式設計作業\\in.dat")); while ((str = in.readLine())!= null) {//readLine()方法, 用於讀取一行,只要讀取內容不為空就一直執行 sb1.append(str); } in.close(); } catch (IOException e) {//當try程式碼塊有異常時轉到catch程式碼塊 System.out.println("讀取有誤"); e.printStackTrace();//printStackTrace()方法是列印異常資訊在程式中出錯的位置及原因 } System.out.println(sb1);//輸出sb1 return sb1; } public static void setFile (String s) throws IOException { //檔案寫入函式 byte[] bs = s.getBytes();//定義位元組陣列用來當作緩衝區 FileOutputStream fos=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\2018下學期作業\\程式設計作業\\out.txt"); try { fos.write(bs); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }//從緩衝區位元組陣列中以位元組流形式取出 fos.close();//關閉讀取流 File file=new File("C:\\Users\\Administrator\\Desktop\\2018下學期作業\\程式設計作業\\out.txt");//建立檔案物件 if(file.exists()){//if語句的條件,呼叫exists方法判斷檔案是否存在 // System.out.println("檔案成功讀入到指定路徑下");//若檔案存在,則輸出檔案存在 } else{//否則 System.out.println("輸出檔案不存在");//輸出檔案不存在 } } }
執行結果
開啟檔案
原始檔案 in.dat
輸出檔案 out.txt