思路:
1、将文件内容存入StringBuffer中。
2、利用split()函数分割字符串,可按(“,”,“.”,“!”,“空格”,“回车”)分割,得到一个数组。
3、遍历数组,将其放入一个Map <String,Integer>中,key=单词,value=单词出现的次数。
4、如要求出文件中出现频率最高的几个单词,则要对Map进行排序。
-----------------------------------------------------------------------------------------------------------------------------------------
以下是实现一个文件中出现频率最高的单词的统计 FileWordCount.java主函数所在文件
import
java.io.BufferedReader;
import
java.io.FileNotFoundException;
import
java.io.FileReader;
import
java.io.IOException;
import
java.util.*;
/**
* Created by IntelliJ IDEA.
* User: FLY
* Date: 11-9-13
* Time: 下午3:59
* To change this template use File | Settings | File Templates.
*/
public
class
FileWordCount {
public
static
void
main(String[] args) {
try
{
BufferedReader br =
new
BufferedReader(
new
FileReader(
"D:\\test.txt"
));
String s;
StringBuffer sb =
new
StringBuffer();
while
((s = br.readLine()) !=
null
) {
sb.append(s);
}
Map<String,Integer> map =
new
HashMap<String, Integer>();
StringTokenizer st =
new
StringTokenizer(sb.toString(),
",.! \n"
);
while
(st.hasMoreTokens()) {
String letter = st.nextToken();
int
count;
if
(map.get(letter) ==
null
) {
count =
1
;
}
else
{
count = map.get(letter).intValue() +
1
;
}
map.put(letter,count);
}
Set<WordEntity> set =
new
TreeSet<WordEntity>();
for
(String key : map.keySet()) {
set.add(
new
WordEntity(key,map.get(key)));
}
// 自己拼接字符串,输出我们想要的字符串格式
System.out.println(
"输出形式一:"
);
for
(Iterator<WordEntity> it = set.iterator(); it.hasNext(); ) {
WordEntity w = it.next();
System.out.println(
"单词:"
+ w.getKey() +
" 出现的次数为: "
+ w.getCount());
}
// 直接打印 WordEntity 对象,实现我们想要的输出效果,只需在WordEntity类中重写toString()方法
System.out.println(
"输出形式二:"
);
for
(Iterator<WordEntity> it = set.iterator(); it.hasNext(); ) {
WordEntity w = it.next();
System.out.println(w);
}
// 我们可以控制只输出前三名来
System.out.println(
"输出形式三:"
);
int
count =
1
;
for
(Iterator<WordEntity> it = set.iterator(); it.hasNext(); ) {
WordEntity w = it.next();
System.out.println(
"第"
+ count +
"名为单词:"
+ w.getKey() +
" 出现的次数为: "
+ w.getCount());
if
(count ==
3
)
// 当输出3个后跳出循环
break
;
count++;
}
}
catch
(FileNotFoundException e) {
System.out.println(
"文件未找到~!"
);
}
catch
(IOException e) {
System.out.println(
"文件读异常~!"
);
}
}
}
WordEntity.java文件
/**
* Created by IntelliJ IDEA.
* User: FLY
* Date: 11-9-13
* Time: 下午4:57
* To change this template use File | Settings | File Templates.
*/
public
class
WordEntity
implements
Comparable<WordEntity> {
private
String key;
private
Integer count;
public
WordEntity (String key, Integer count) {
this
.key = key;
this
.count = count;
}
public
int
compareTo(WordEntity o) {
int
cmp = count.intValue() - o.count.intValue();
return
(cmp ==
0
? key.compareTo(o.key) : -cmp);
//只需在这儿加一个负号就可以决定是升序还是降序排列 -cmp降序排列,cmp升序排列
//因为TreeSet会调用WorkForMap的compareTo方法来决定自己的排序
}
@Override
public
String toString() {
return
key +
" 出现的次数为:"
+ count;
}
public
String getKey() {
return
key;
}
public
Integer getCount() {
return
count;
}
}
输出结果:
输出形式一:
单词:is 出现的次数为:
4
单词:my 出现的次数为:
2
单词:very 出现的次数为:
2
单词:word 出现的次数为:
2
单词:a 出现的次数为:
1
单词:are 出现的次数为:
1
单词:boy 出现的次数为:
1
单词:english 出现的次数为:
1
单词:fool 出现的次数为:
1
单词:good 出现的次数为:
1
单词:hah 出现的次数为:
1
单词:hello 出现的次数为:
1
单词:hey 出现的次数为:
1
单词:i 出现的次数为:
1
单词:love 出现的次数为:
1
单词:mary 出现的次数为:
1
单词:much 出现的次数为:
1
单词:name 出现的次数为:
1
单词:ok 出现的次数为:
1
单词:poor 出现的次数为:
1
单词:so 出现的次数为:
1
单词:sophie 出现的次数为:
1
单词:you 出现的次数为:
1
输出形式二:
is 出现的次数为:
4
my 出现的次数为:
2
very 出现的次数为:
2
word 出现的次数为:
2
a 出现的次数为:
1
are 出现的次数为:
1
boy 出现的次数为:
1
english 出现的次数为:
1
fool 出现的次数为:
1
good 出现的次数为:
1
hah 出现的次数为:
1
hello 出现的次数为:
1
hey 出现的次数为:
1
i 出现的次数为:
1
love 出现的次数为:
1
mary 出现的次数为:
1
much 出现的次数为:
1
name 出现的次数为:
1
ok 出现的次数为:
1
poor 出现的次数为:
1
so 出现的次数为:
1
sophie 出现的次数为:
1
you 出现的次数为:
1
输出形式三:
第
1
名为单词:is 出现的次数为:
4
第
2
名为单词:my 出现的次数为:
2
第
3
名为单词:very 出现的次数为:
2
|
方法二
//CountWord.java
package
com.xie.tencent;
import
java.io.BufferedReader;
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.IOException;
import
java.io.InputStreamReader;
import
java.util.HashMap;
/**
* 这个类用于统计某个单词在所有文件中出现的次数。
* @author centre
*
*/
public
class
CounterWord {
FileReader fr;
private
HashMap<String, Integer> hMap=
new
HashMap<String, Integer>();;
public
HashMap<String, Integer> gethMap() {
return
hMap;
}
/**
* 这个构造方法用于持有对方引用
* @author centre
* @param f FileReader
*/
public
CounterWord(FileReader f) {
fr=f;
}
/**
* 根据传入的文件路径,打开文件,同时分析其中的单词个数,
* 存放进一个HashMap
* @author centre
* @param path String 文件的绝对路径
* @return 返回值貌似没用,在需要时可以接收
*/
public
boolean
openFile(String path){
boolean
b=
true
;
try
{
FileInputStream fis=
new
FileInputStream(path);
BufferedReader br=
new
BufferedReader(
new
InputStreamReader(fis));
try
{
String words=br.readLine();
while
(words!=
null
) {
//System.out.println(words);
String[] word=words.split(
","
);
for
(
int
i =
0
; i < word.length; i++) {
addWordCount(word[i]);
}
words=br.readLine();
}
}
catch
(IOException e) {
System.out.println(
"文件读取异常。"
);
e.printStackTrace();
}
}
catch
(FileNotFoundException e) {
System.out.println(
"没有找到该文件:"
+path);
b=
false
;
e.printStackTrace();
}
return
b;
}
/**
* 将单词放进map,同时统计单词出现的次数
* @param word String 单词
*/
private
void
addWordCount(String word) {
if
(hMap.containsKey(word)) {
hMap.put(word, hMap.get(word).intValue()+
1
);
}
else
{
hMap.put(word,
1
);
}
}
|
本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2013/01/17/2865251.html,如需转载请自行联系原作者