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