[IO流+集合 解决问题]读取文件,统计文件中数据出现次数,找到出现次数最多的十个数据,打印该数据和出现次数

如题:

读取给定文件,统计每个数据出现的次数,找到出现次数最多的十个数据,打印该数据和出现的次数

思路:

  1. 采用字符缓冲流对文件中的数据进行读取,
  2. 将读取到的数据 利用String的split方法,将数据存入ArrayList里
  3. 利用hashMap存储数据和其出现次数的对应关系
  4. 重写comparator,将次数由多到少排序
  5. 将排序好的Entry类型的数据存入优先级队列
  6. 遍历优先级队列的前10个数据,通过Entry类型得到hashMap中出现次数最多前十位的键和值

代码实现:

  • 在实现代码之前将以下数字拷贝在路径表示位置的 test.txt文档里
    86,445,50,342,913,
    446,879,561,184,485,718,907,820,
    71,913,89,94,587,648,730,
    527,42,390,936,106,171,549,21,
    818,577,539,930,518,431,962,631,
    401,687,820,262,268,605,815,
    236,336,1,460,872,
    250,868,504,513,167,496,
    885,563,618,397,51,660,
    829,623,228,996,268,597,665,
    281,875,182,565,618,
    511,405,125,319,492,579,
    352,141,711,576,709,
    930,629,277,759,484,579,626,380,
    748,890,136,58,920,803,176,97,
    906,265,239,893,415,66,128,865,185,
    212,298,538,969,407,838,86,104,
    878,181,186,508,21,203,685,
    301,881,89,772,12,
    506,405,20,347,497,
    489,175,833,419,731,486,599,
    427,762,306,935,521,246,
    411,180,683,582,981,532,737,
    977,9,446,878,477,462,702,587,
    55,743,72,512,936,343,58,653,32,
    42,690,490,488,624,74,
    904,93,176,160,15,617,812,688,
    658,737,422,196,646,
    66,548,680,351,404,
    918,423,905,225,219,748,723,95,928,
    193,715,262,23,566,
    599,954,157,197,666,214,450,
    596,585,931,203,180,476,461,173,583,
    283,141,514,82,953,359,967,718,
    931,734,126,402,598,500,550,
    704,697,377,884,465,803,512,375,552,
    698,789,866,649,100,209,659,
    142,320,973,815,346,51,
    760,241,32,631,132,268,450,439,
    516,560,936,654,318,955,751,546,
    409,267,385,863,231,472,745,141,
    451,501,823,672,557,961,428,131,30,
    801,810,927,286,388,628,
    576,40,523,899,283,221,429,221,
    35,962,832,952,571,560,
    117,698,363,927,621,75,472,175,886,
    200,851,876,5,210,773,167,473,921,
    930,513,949,266,982,155,341,846,621,
    970,548,603,62,894,5,327,
    275,166,807,966,385,80,
    275,591,2,678,29,867,596,
    184,332,824,613,835,636,159,340,
    284,198,395,328,399,331,555,973,744,
    931,622,992,674,578,498,79,590,633,
    820,521,292,4,799,42,968,808,204,
    624,294,282,649,282,475,
    389,486,167,115,255,
    276,505,717,850,949,670,461,83,
    872,356,431,906,458,
    364,325,295,601,957,224,890,
    178,931,385,70,988,
    647,73,253,725,160,948,494,194,
    243,418,391,444,536,176,
    529,19,478,695,907,810,
    853,438,210,520,981,
    738,256,436,17,673,243,
    794,980,689,611,399,797,273,41,
    490,841,227,304,537,
    577,380,358,797,80,347,
    465,100,399,999,87,942,469,
    347,318,946,848,984,6,466,197,
    778,785,326,302,375,890,828,816,119,
    448,959,46,989,521,703,
    615,823,100,521,495,91,675,
    564,93,726,597,564,409,
    71,650,792,604,237,156,94,352,
    385,645,339,948,984,614,
    675,435,87,891,967,146,453,381,
    260,47,544,573,193,
    254,739,643,443,886,712,938,
    934,281,78,905,972,956,
    116,782,803,721,354,658,
    764,742,551,234,631,185,570,82,700,
    781,803,927,899,217,
    616,860,309,557,472,159,135,
    672,319,6,135,180,
    466,551,631,824,564,813,312,280,
    896,690,408,272,706,370,846,
    993,897,784,936,117,241,
    991,13,877,867,173,558,113,516,
    552,216,353,15,279,156,840,580,
    343,832,91,556,729,470,353,495,
    667,397,349,207,27,
    854,35,501,726,537,194,258,796,142,
    276,478,915,197,476,196,47,431,224,
    630,598,55,982,962,808,
    847,474,958,738,256,530,5,392,
    766,461,164,492,12,971,645,
    829,281,265,435,120,245,307,569,
    719,255,643,663,892,682,
public class Demo {

    public static void read() throws IOException   {
        String path = "C:\\Users\\50579\\Desktop\\test.txt";
        //文件操作流
        FileInputStream fileInputStream = new FileInputStream(path);
        //转换流:将字节转换为字符
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
        //缓冲流:::
        //字符缓冲流
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        //读取数据:将数据读取在ArrayList里
        ArrayList<Integer> list  = new ArrayList<>();
        String line;
        while ((line = bufferedReader.readLine())!= null){ //一行一行读取
            String[] split = line.split(","); //按照逗号分隔开
            for (int i = 0; i < split.length ; i++) { //遍历数组
                int a = Integer.valueOf(split[i]);//自动装包
                list.add(a);
            }
        }
        //统计:用hashMap,键表示出现的数据,值表示当前数据出现的次数
        HashMap<Integer,Integer> hashMap = new HashMap<Integer, Integer>();
            //迭代器遍历ArrayList,判断读取的数据
            Iterator<Integer> iterator = list.iterator();
            while(iterator.hasNext()){
                Integer value = iterator.next();
                Integer n;
                if((n = hashMap.get(value))!= null){   //读到的数存在, 对应的值加1
                   hashMap.put(value,n+1);
                }else{   //读的数不存在,将该数据添加进hashMap,值为1
                    hashMap.put(value,1);
                }
            }

            //用比较器实现数据出现的次数从多到少排序
        Comparator <Map.Entry <Integer, Integer>> comparator = new Comparator <Map.Entry <Integer, Integer>>() {
            @Override
            public int compare(Map.Entry <Integer, Integer> o1, Map.Entry <Integer, Integer> o2) {
                return o2.getValue() - o1.getValue(); //值从大到小排序
            }
        };

           //将排序好的数据存入优先级队列
        PriorityQueue <Map.Entry <Integer, Integer>> priorityQueue = new PriorityQueue <>(1000, comparator);
        Iterator <Map.Entry <Integer, Integer>> iterator1 = hashMap.entrySet().iterator();
        while (iterator1.hasNext()) {
            Map.Entry <Integer, Integer> entry = iterator1.next();
            priorityQueue.add(entry);
        }

           //将优先级队列前十个数据进行打印,通过entry类型在hashMap中找到对应的键和值。
        for (int i = 0; i < 10; i++) {
            Map.Entry <Integer, Integer> entry = priorityQueue.poll();
            System.out.println(entry.getKey()+":"+entry.getValue());
        }

        bufferedReader.close(); //关闭流
    }
    public static void main(String[] args) throws IOException {
        read();
    }
}

实现结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值