1. 程式人生 > >java 單詞本-詞頻統計

java 單詞本-詞頻統計


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