4、 编写一个Java应用程序,使用RandomAccessFile流统计Hello.txt中的单词,要求如下:
(1)计算全文中共出现了多少个单词(重复的单词只计算一次);
(2)统计出有多少个单词只出现了一次;
(3)统计并显示出每个单词出现的频率,并将这些单词按出现频率高低顺序显示在一个TextArea中。麻烦大家帮帮忙解决下!
(1)计算全文中共出现了多少个单词(重复的单词只计算一次);
(2)统计出有多少个单词只出现了一次;
(3)统计并显示出每个单词出现的频率,并将这些单词按出现频率高低顺序显示在一个TextArea中。麻烦大家帮帮忙解决下!
这两天老是看见相同的帖子,幻读吗...
http://topic.csdn.net/u/20091027/22/73211b5d-02ea-4d15-8bf1-1c16d34e89da.html
看这个一样的帖子
put("单词",单词出现的次数);
如何实现按照value排序?
然后用一个List把这些统计结果添加进去,然后自己实现一个Comparator做排序
{
int a=1;
if(map.get(str)==null)
{
map.put(str,a);
}
else
{
int b=map.get(str);
map.put(str,b+1);
}
}
key是String 也就是单词
value是Integer类型 放的是出现的次数
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class WordCount {
FileInputStream fis;
InputStreamReader isr;
BufferedReader br;
Set<String> set=new HashSet<String>();
Map<String, Integer> map=new HashMap<String, Integer>();
/*
*统计非重复的单词个数
*/
public int count(File file){
try{
FileInputStream fis=new FileInputStream(file);
InputStreamReader isr=new InputStreamReader(fis);
BufferedReader br=new BufferedReader(isr);
String line="";
while((line=br.readLine())!=null){
String[] str=line.split("\\s|,");//以空白字符或者英文逗号划分
for(int i=0;i<str.length;i++){
set.add(str[i]);
if(map.get(str[i])==null){
map.put(str[i], 1);
}
else{
map.put(str[i], (map.get(str[i]))+1);
}
}
}
br.close();
isr.close();
fis.close();
}
catch(Exception e){
e.printStackTrace();
}
Collection<String> c=map.keySet();
Iterator<String> it=c.iterator();
int num=0;
while(it.hasNext()){
String str=it.next();
//每个单词出现出现的次数
System.out.println("单词"+str+"出现的次数是:"+map.get(str));
if(map.get(str)==1){
num++; //统计只出现了一次的单词的总数
}
}
System.out.println("只出现一次的单词有"+num+"个");
return set.size(); //返回总的单词数量(非重复)
}
public static void main(String[] args){
WordCount wc=new WordCount();
int count=wc.count(new File("d:/test.txt"));
System.out.println("文本中出现的单词(非重复)数量是:"+count);
}
}PS.
1.我不是用RandomAccessFile流统计做的
2.对于每个单词的划分我是按照空白符或者逗号分隔的,正则表达式还没学完,所以分的很粗糙
3.欢迎大家指出程序的缺点和毛病,谢谢
public static void main(String[] args) throws IOException {
RandomAccessFile raf = new RandomAccessFile("D:\\Hello.txt","r");
Scanner scan = new Scanner(raf.getChannel());
HashMap<String,Integer> cache = new HashMap<String,Integer>();
while(scan.hasNext()){
String word = scan.next();
Integer count = cache.get(word);
if(count==null)count=0;
cache.put(word, count+1);
}
ArrayList<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(cache.entrySet());
if(list.get(0).getValue()==1)singleCount++;
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>(){
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
if(o2.getValue()==1)singleCount++;
return -o1.getValue().compareTo(o2.getValue());
}
});
System.out.println("一共出现了 "+list.size()+" 个单词");
System.out.println("有 "+singleCount+" 个单词只出现了一次");
for(Map.Entry<String, Integer> e : list){
System.out.println(e.getKey()+"\t"+e.getValue());
}
}}
1:hashMap key是读取的单词 value是次数。hashMap可以提取出一个Keyset(set)出来。
2:保存前,看下有没有这个key,有的话value+1.
3:将所有的value取出来,放在array中,然后sort。
4:输出。
“[\\s\\d\\p{Punct}]+”