最小

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Random;

/**
 * 十万个数据里选出重复次数最多的十组
 * 且需要用PriorityQueue来实现
 * @author wangyu
 * @data 2018年7月9日
 */
public class MinData {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//ArrayList类型的容器list
		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 val = next.getValue();
	    	//如果优先级队列里的数据长度小于10,就往进添加
	    	if(priorityqueue.size() < 10) {
	    		priorityqueue.add(next);
	    	//如果数据超过10,比较队顶的元素和要进入的元素
	    	} else {
	    		//如果要进入的元素大于队顶的元素,就移除队顶本来的元素,加入新的元素
	    		if(priorityqueue.peek().getValue() < val) {
	    			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 + "  ");
		}
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值