Java简易写法WordCount

public class test{
    public static void main(String[]args){
        File file =new File ("d:/data.txt");  //读文件,可以统计文件长度
        BufferedReader br =new BufferedReader(new FileReader("d:/data.txt"));
        long len=file.length(); //文件的总字符长度
        long avg=len/5;   //分五个线程来计算
        List<Long> locate=new ArrayList<>(); //定义集合存储定位
        locate.add(0L);  //初始第一个
        long curpos=0;  //当前游标的位置
        while((curpos+avg)<len){  //小于文章长度就可以一直遍历
             curpos+=avg;  
            br.skip(avg);  //跳过avg的长度
            int read=br.read();//跳完之后读下一个字符
            curpos++;  //游标也向下走一个
            while(read!=13&&read!=32&&read!=-1){//这个代表没有读到空格,回车跟结尾
                read=br.read();
                curpos++;  //主要没读到就一直读,直到满足条件了就退出
            }
            locate.add(curpos);
        }
         locate.add(len);
        //现在需要五个线程分别计算,可以定义集合来存储
        List<Map<String,Integer>> list=new ArrayList<>();
         for(int i=0;i<5;i++){
             list.add(new HashMap());
         }
        //开启线程池,开五个线程
        ExecutorService pool=Executors.newFixedThreadPool(5);
        for(int i=0;i<5;i++){
            final int flag=i;
            pool.execute(()->{
                BufferedReader br1=new BufferedReader(new FileReader("d:/data.txt"));
                char[] arr=new char[(int)(locate.get(flag+1)-locate.get(flag))];
                br1.skip(locate.get(flag));
                br1.read(arr);
                String str=new String(arr);
                String [] infos =str.split("\\s+"); //将字符串切割,去除所有的空白字符
                for(String word:infos){  //遍历切割后的信息
                    if(list.get(flag).containsKey(word)){ //在集合中已经存在了
                        list.get(flag).put(word,list.get(flag).get(word)+1);
                    }else{  //之前还没有
                        list.get(flag).put(word,1);
                    }
                     }
                
            });}
        //关闭线程池
        pool.shutdown();
        while(!pool.isTerminated());
        //做最后的count
        Map<String,Integer> res=new HashMap();
        for(Map<String,Integer> sub:list){  //外层循环
            for(String key:sub.keySet()){
                if(res.containsKey(key)){  //这个代表以及存在了
                    res.put(key,res.get(key)+sub.get(key));
                }else{
                    res.put(key,sub.get(key));
                }
                
            }
            
        }
        System.out.println(res);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值