Java基础 多线程运用——统计文本中的各个单词出现次数

  题目:统计文本中的各个单词出现次数,并将汇总数据保存到txt文件中。

        因为是多个线程对一个文本进行检索,所以我们应当使用调用Runnable接口的线程;首先我们来新建一个类,来实现单个线程对文本中的指定部分的检索。

import java.util.HashMap;
import java.util.Map;

public class WordCount implements Runnable{
    //初始化线程要检索的内容
    String content = " ";
    //用Map来记录文本中出现的单词和单词出现的次数
    Map<String,Integer> map = new HashMap<>();
    //构造函数,方便调用线程,参数为要检索的字符串
    public WordCount (String content){
        this.content= content;
    }

    @Override
    public void run() {
        //将要检索的字符串,去掉头尾空格后,按空格分开分组
        String[] splitStr = content.trim().split("\\s");
        //遍历 splitStr 数组,得到存储的各个单词
        for (int i = 0; i < splitStr.length; i++) {
            //如果Map中存有检索到的单词,将对应的value值即出现的次数加一
            if (map.containsKey(splitStr[i])){
                Integer value= map.get(splitStr[i])+1;
                map.put(splitStr[i],value);

            }else {
                //如果没有,则在Map中添加该单词
                map.put(splitStr[i],1);
            }
        }
    }
}

        接下来,我们就要设计主线程来读取文本中的内容,并遍历分组给不同的线程进行执行。因为涉及多个子线程运行,所以我们应当将这些子线程托管给线程池。下面,我们就进行读取文件和遍历文本的代码。

import java.io.*;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class WordCountTeacher {
    // 设置一个Map集合,key为线程名;value为线程所存储的map合集信息(单词及其出现次数)
    static Map<String, Map<String, Integer>> threadMap = new TreeMap<>();

    public static void main(String[] args) {
        //记录开始时间
        long start = System.currentTimeMillis();
        //字符流读取文本并输出统计结果
        FileReader fr;
        BufferedReader bf;
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        StringBuffer txtContent;
        //记录正在读取的行数
        int lineNum = 0;
        //线程池
        ExecutorService executorService = Executors.newCachedThreadPool();

        try {
            //注意,地址为读取文件的路径
            fr = new FileRead
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值