java实现文件单词频率统计

该博客介绍了一种使用Java统计文件中单词频率的方法。通过读取文件内容,使用split()函数分割单词,并存储到Map中进行计数。然后利用TreeSet对Map排序,展示出现频率最高的单词。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 思路:

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值