4、 编写一个Java应用程序,使用RandomAccessFile流统计Hello.txt中的单词,要求如下:
(1)计算全文中共出现了多少个单词(重复的单词只计算一次);
(2)统计出有多少个单词只出现了一次;
(3)统计并显示出每个单词出现的频率,并将这些单词按出现频率高低顺序显示在一个TextArea中。麻烦大家帮帮忙解决下!

解决方案 »

  1.   

    觉得可以用HashMap试试,用key存放单词,value存放单词出现的次数
      

  2.   

    怎么又是这个问题
    这两天老是看见相同的帖子,幻读吗...
    http://topic.csdn.net/u/20091027/22/73211b5d-02ea-4d15-8bf1-1c16d34e89da.html
    看这个一样的帖子
      

  3.   

    用TreeMap
    put("单词",单词出现的次数);
      

  4.   

    key存放单词,value存放单词出现的次数
    如何实现按照value排序?
      

  5.   

    可以自己实现一个统计类,有两个成员变量,单词和次数
    然后用一个List把这些统计结果添加进去,然后自己实现一个Comparator做排序
      

  6.   

    不知道这样行不行while((str=read.readUTF())!=null)
    {
    int a=1;
    if(map.get(str)==null)
    {
    map.put(str,a);
    }
    else
    {
    int b=map.get(str);
    map.put(str,b+1);
    }
    }
      

  7.   

    上面的map是Hashmap
    key是String 也就是单词
    value是Integer类型  放的是出现的次数
      

  8.   

    用Map喽,自己动手,成长快快~ 
      

  9.   

     用  HashMap 吧,我觉得也是可行的
      

  10.   

    自己随便写了一个,比较粗糙import java.io.BufferedReader;
    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.欢迎大家指出程序的缺点和毛病,谢谢
      

  11.   

    对不起我的代码中可以不用HashSet的,刚开始只看了第一个要求,认为一个HashSet就可以搞定了,后面用了HashSet后可以不用HashSet了。
      

  12.   

    对不起我的代码中可以不用HashSet的,刚开始只看了第一个要求,认为一个HashSet就可以搞定了,后面用了HashMap后可以不用HashSet了。
      

  13.   

    public class FileStatistician { private static int singleCount = 0;//单独出现的次数
    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());
    }
    }}
      

  14.   

    用hashmap来做的思路。前面已有代码。但是我本人不喜欢代码,有思路就好。自己写出来的比COPY的更有成就感。
    1:hashMap key是读取的单词 value是次数。hashMap可以提取出一个Keyset(set)出来。
    2:保存前,看下有没有这个key,有的话value+1.
    3:将所有的value取出来,放在array中,然后sort。
    4:输出。
      

  15.   

    个人觉得正则表达式应该用
    “[\\s\\d\\p{Punct}]+”
      

  16.   

    路过的,看看,不过各楼想法好多啊,我一开始看没想到用map/.