Java 优先级队列 PriorityQueue,在处理topK问题时,
首先创建一个逆序的PriorityQueue,定义排序规则
//创建优先级队列处理top N
Queue<Entry<String, Float[]>> pqtag = new PriorityQueue<Entry<String, Float[]>>(size,new Comparator<Map.Entry<String, Float[]>>(){
//对某个属性的map按value进行排序
@Override
public int compare(Map.Entry<String, Float[]> obj1, Map.Entry<String, Float[]> obj2) {
if(obj1.getValue()[1] > obj2.getValue()[1]) //由小到大排列
return 1;
if(obj1.getValue()[1] == obj2.getValue()[1])
return 0;
else
return -1;
}
});
然后依据K的大小向PriorityQueue中添加元素,
//生成tagid优先级队列
for (Entry<String,Float[]> entry: hmtag.entrySet()) {
Float val[] = entry.getValue();
val[1] = (isvalve == 0) ? (val[0]+val[1]) : (val[0] + (float)(val[1]*Math.log(tn+1)));
if(val[1] < threshold) //阈值过滤
continue;
if(pqtag.size() < size){
pqtag.add(entry);
}else{
Entry<String,Float[]> entemp = pqtag.peek();
if(entemp.getValue()[1] < val[1]){
pqtag.poll();
pqtag.add(entry);
}
}
}
数据处理完后,在用List将PriorityQueue里的数据排序。
//将队列元素逆序输出
List<Entry<String,Float[]>> lstag = new ArrayList<Entry<String,Float[]>>(pqtag);
Collections.sort(lstag,new Comparator<Map.Entry<String, Float[]>>(){ //对某个属性的map按value进行排序
@Override
public int compare(Map.Entry<String, Float[]> obj1, Map.Entry<String, Float[]> obj2) {//从高往低排序
if(obj1.getValue()[1] < obj2.getValue()[1])
return 1;
if(obj1.getValue()[1] == obj2.getValue()[1])
return 0;
else
return -1;
}
} );
需要注意的是,只有同PriorityQueue.poll()方法依次取出的数据是有序的,直接遍历队列的数据是无序的。