Java优先级队列处理topK问题

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()方法依次取出的数据是有序的,直接遍历队列的数据是无序的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值