Java优先级队列处理topK问题

Java 优先级队列 PriorityQueue,在处理topK问题时,

首先创建一个逆序的PriorityQueue,定义排序规则

//创建优先级队列处理top N
	Queue> pqtag =  new PriorityQueue>(size,new Comparator>(){   
                //对某个属性的map按value进行排序
		@Override
		public int compare(Map.Entry obj1, Map.Entry 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 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 entemp = pqtag.peek();
			if(entemp.getValue()[1] < val[1]){
				pqtag.poll();
				pqtag.add(entry);
			}
		}
	}


数据处理完后,在用List将PriorityQueue里的数据排序。

//将队列元素逆序输出
	List> lstag = new ArrayList>(pqtag);
	Collections.sort(lstag,new Comparator>(){   //对某个属性的map按value进行排序
		@Override
		public int compare(Map.Entry obj1, Map.Entry obj2) {//从高往低排序 			  
		       if(obj1.getValue()[1] < obj2.getValue()[1])  
		           return 1;  
		       if(obj1.getValue()[1] == obj2.getValue()[1])  
		           return 0;  
		       else  
		          return -1;  
		}
	} );


需要注意的是,只有同PriorityQueue.poll()方法依次取出的数据是有序的,直接遍历队列的数据是无序的。

你可能感兴趣的:(Java)