Java简易写法WordCount

发布于:2022-12-06 ⋅ 阅读:(197) ⋅ 点赞:(0)

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);
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到