词频统计程序(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;
}
}