优先级队列PriorityQueue测试

	PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。
	该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。
	下面是使用PriorityQueue构建一个top N的例子:
//实体类 
package com.hello.queueTest;
import lombok.Data;

@Data 
public class Goods { 
private String id; 
private String name; 
private Integer clickNum;
public Goods() {
}
public Goods(String id, String name, Integer clickNum) {
    this.id = id;
    this.name = name;
    this.clickNum = clickNum;
}
}

//测试类
package com.hello.queueTest;

import java.util.ArrayList; 
import java.util.Comparator;
import java.util.List; 
import java.util.PriorityQueue;

//优先级队列ProperQueue测试类 
/* 常用方法注解: 
add(E e):插入元素 add(E e),实际上方法内部调用return offer(E e);
offer(E e):插入元素 
peek():检索但不删除此队列的头 
poll():检索且删除队列的头
 */ 
 public class PriorityQueueTest {
public static void main(String[] args) {
//定义队列并内部类实现比较接口
    PriorityQueue<Goods> pq=new PriorityQueue<>((o1, o2) -> {
        if(o2.getClickNum().equals(o1.getClickNum())){   //点击次数一样比较id,id小的排在前面
            return o1.getId().compareTo(o2.getId());
        }
        return o2.getClickNum()-o1.getClickNum();
    }); 
    
    Goods g1=new Goods("1","11",1);
    Goods g2=new Goods("2","22",2);
    Goods g3=new Goods("3","33",4);
    Goods g4=new Goods("4","44",4);
    Goods g5=new Goods("5","55",5);

    pq.add(g3);
    pq.add(g5);
    pq.add(g1);
    pq.add(g4);
    pq.add(g2);

    //进栈后改变队列中的对象并不会重新排序,只能先删除改变值后再添加
	/* pq.remove(g3); 
	   g3.setClickNum(3); 
	   pq.add(g3);*/

    //poll出栈才会按排序输出,出栈后元素是全部清空的
    while (pq.size()>0){
        System.out.println(pq.poll());
    }
    System.out.println("------------------------------------------");
    
	/* pq.forEach(g->{ 
	//循环是么有顺序的 
	System.out.println(g.toString()); });*/

//构建topN,只能按升序输出,因为要在队列的前面poll()出来。 
	int maxNum=3; 
	PriorityQueue<Goods> p=new PriorityQueue<>(maxNum, (o1, o2) -> { 
		if(o1.getClickNum().equals(o2.getClickNum())){
			 return o1.getId().compareTo(o2.getId());
  	       } 
			return o1.getClickNum()-o2.getClickNum(); 
		 }); 
			 
	 List<Goods> list=new ArrayList<>();
 	 list.add(g3); list.add(g5); 
	 list.add(g1); list.add(g4);
     list.add(g2);

    list.forEach(good->{
        if(p.size()<maxNum){
            p.add(good);
        }else{
            if(p.peek().getClickNum()<good.getClickNum()){
                p.poll();
                p.add(good);
            }
        }
    });
    while (p.size()>0){
        System.out.println(p.poll());
    }
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值