Java:詞頻統計程式
阿新 • • 發佈:2018-12-12
詞頻統計程式(Java)
題目描述:
做一個詞頻統計程式,該程式具有以下功能: 基本要求: (1)可匯入任意英文文字檔案 (2)統計該英文檔案中單詞數和各單詞出現的頻率(次數),並能將單詞按字典順序輸出。 (3)將單詞及頻率寫入檔案。
提高要求:
(4)將單詞及頻率寫入資料庫。
具體實現程式碼如下(不包括DAO部分):
package com._520it._chapter02; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com._520it._chapter02.dao.IWordDAO; import com._520it._chapter02.dao.impl.WordDAOImpl; import com._520it._chapter02.domain.Word; /** * 詞頻統計程式 * @author Jack * @date 2018-09-21 * @version 1.0 */ public class WordCounts { public static void main(String[] args) { // 從檔案中讀取資料,並存入List集合中 List<String> list = readFromFile(); String str = list.get(0); str.replaceAll(",", ""); str.replaceAll(".", ""); String[] words = str.split(" "); // 將單詞全部轉換為小寫 for (int i = 0; i < words.length; i++) { words[i] = words[i].toLowerCase(); } // 將單詞按照字典排序 words = sortWords(words); // 將結果放入Map集合中 Map<String, Integer> map = new HashMap<>(); for (int i = 0; i < words.length; i++) { if (!map.containsKey(words[i])) { map.put(words[i], 1); } else { int num = map.get(words[i]) + 1; map.put(words[i], num); } } // 將結果寫入檔案 writeToFile(map); Iterator<String> iterator = map.keySet().iterator(); IWordDAO dao = new WordDAOImpl(); while (iterator.hasNext()) { Word w = new Word(); String word = (String) iterator.next(); w.setWord(word); w.setCount(map.get(word).longValue()); // 將結果寫入資料庫 dao.save(w); } } /** * 從檔案中讀取資料 * @return 存有資料的List集合 */ private static List<String> readFromFile() { // 表示讀取的行 String line = null; List<String> list = new ArrayList<>(); try { // 建立字元輸入流物件 FileReader srcFile = new FileReader("resources/data.txt"); // 字元緩衝輸入流 BufferedReader in = new BufferedReader(srcFile); while ((line = in.readLine()) != null) { // 將資料儲存到list集合中 list.add(line); } // 關閉資源 in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return list; } /** * 將結果寫入檔案 * @param map Map集合 */ private static void writeToFile(Map<String, Integer> map) { try { // 建立字元輸出流物件 FileWriter desFile = new FileWriter("resources/result.txt", true); // 字元緩衝輸出流 BufferedWriter out = new BufferedWriter(desFile); Iterator<String> iterator = map.keySet().iterator(); while (iterator.hasNext()) { String word = (String) iterator.next(); out.write(word + " : " + map.get(word)); // 輸出換行 out.newLine(); } // 關閉資源 out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 將字串陣列按照字典排序 * @param str 需要排序的陣列 * @return 排序後的字串陣列 */ private static String[] sortWords(String[] str) { for (int i = 0; i < str.length - 1; i++) { for (int j = 0; j < str.length - 1 - i; j++) { if ((str[j].compareTo(str[j + 1])) > 0) { String temp = str[j]; str[j] = str[j + 1]; str[j + 1] = temp; } } } return str; } }