1. 程式人生 > >Java:詞頻統計程式

Java:詞頻統計程式

                                                          詞頻統計程式(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;
	}
}