Java——十万个随机数求出里面重复次数最多的十个数

public class TestDemo2 {

    public static void main(String[] args) {
        //把100000个数放进ArrayList类型的容器
        ArrayList<Integer> arraylist = new ArrayList<Integer>(100000);
        //随机插入一万个数据
        Random random = new Random();
        for(int i = 0;i < 100000;i++) {
            int val = random.nextInt(10000);
            arraylist.add(val);
        }

        //重写比较器,目的是为了比较的hashmap中的value
        Comparator<Map.Entry<Integer,Integer>> comparator = new Comparator<Map.Entry<Integer,Integer>>() {
            public int compare(Map.Entry<Integer,Integer> o1,Map.Entry<Integer,Integer> o2) {
                return o1.getValue() - o2.getValue();
            }
        };
        //创建一个优先级队列的对象。自定义构造函数,则比较器需要重写(根据需求写大小跟堆),大小设为10
        PriorityQueue<Map.Entry<Integer,Integer>> priorityqueue = new PriorityQueue<Map.Entry<Integer,Integer>>(10,comparator);
        //创建一个hashmap对象,(需要记录数以及他的出现次数)
        HashMap<Integer,Integer> hashmap = new HashMap<Integer,Integer>();
        //迭代器迭代arraylist,记录每个值出现的次数
        Iterator<Integer> iterator = arraylist.iterator();
        while(iterator.hasNext()) {
            Integer integer = iterator.next();
            //如果没找到Key,证明这个值没有出现,就给value(次数)赋值0
            if(!hashmap.containsKey(integer)) {
                hashmap.put(integer, 0);
            }
            //记录数据
            hashmap.put(integer, hashmap.get(integer) + 1);
        }
        //迭代器迭代hashmap
        Iterator<Map.Entry<Integer, Integer>> iterator1 = hashmap.entrySet().iterator();
        while(iterator1.hasNext()) {
            Map.Entry<Integer,Integer> next = iterator1.next();
            //得到遍历时每一次的value值
            int maxValue = next.getValue();
            //如果优先级队列里的数据长度小于10,就往进添加
            if(priorityqueue.size() < 10) {
                priorityqueue.add(next);
            //如果数据超过10,比较队顶的元素和要进入的元素
            } else {
                //如果要进入的元素大于队顶的元素,就移除队顶本来的元素,加入新的元素
                if(priorityqueue.peek().getValue() < maxValue) {
                    priorityqueue.remove();
                    priorityqueue.add(next);
                }
            }
        }
        //迭代器遍历优先级队列,得出结果
        Iterator<Map.Entry<Integer,Integer>> iterator2 = priorityqueue.iterator();
        while(iterator2.hasNext()) {
            Map.Entry<Integer, Integer> next = iterator2.next();
            Integer key = next.getKey();
            Integer value = next.getValue();
            System.out.println("数字:"+ key +"  重复次数:"+value + "  ");
        }
    }
}

运行结果:

数字:4869  重复次数:21  
数字:6048  重复次数:22  
数字:2451  重复次数:21  
数字:2695  重复次数:22  
数字:5411  重复次数:22  
数字:9920  重复次数:22  
数字:4532  重复次数:22  
数字:2064  重复次数:24  
数字:3017  重复次数:23  
数字:9453  重复次数:22  

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/81262710