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;
	}
}

猜你喜欢

转载自blog.csdn.net/fashion_man/article/details/82889943