package com.lirui.priorityqueue;
import java.util.Comparator;
/*
* 优先级队列是通过二叉小根堆实现的。
* 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。
* 元素大小的评判可以通过元素本身的自然顺序,也可以通过构造时传入的比较器。
*/
import java.util.PriorityQueue;
public class Test1 {
private String name;
private int population;
public Test1(String N, int population) {
this.name = N;
this.population = population;
}
public String getName() {
return name;
}
public int population() {
return population;
}
@Override
public String toString() {
return name + String.valueOf(population);
}
public static void main(String[] args) {
// 构造一个比较器
Comparator<Test1> comparator = new Comparator<Test1>() {
@Override
public int compare(Test1 o1, Test1 o2) {
if (o1.population == o2.population)
return 0;
else if (o1.population > o2.population)
return -1;
else {
return 1;
}
}
};
// 通过构造的比较器来new一个优先级队列。
PriorityQueue<Test1> priority = new PriorityQueue<>(comparator);
priority.add(new Test1("beijing", 960000));
priority.add(new Test1("shanghai", 657000));
priority.add(new Test1("wuhan", 576200));
priority.add(new Test1("xianning", 241000)); // 向队列中插入一个元素,和offer()函数用法相同,但是add()插入异常时会抛出异常,而offer()插入异常是会返回false.
boolean flag = priority.offer(new Test1("dongbei", 475120));
System.out.println(priority.peek());
System.out.println(priority);
priority.remove(); // 删除堆顶元素,和poll()方法效果一样,但是remove()方法失败是抛出异常,而poll()则会返回null
System.out.println(priority);
priority.poll();
System.out.println(priority);
}
}
import java.util.Comparator;
/*
* 优先级队列是通过二叉小根堆实现的。
* 优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。
* 元素大小的评判可以通过元素本身的自然顺序,也可以通过构造时传入的比较器。
*/
import java.util.PriorityQueue;
public class Test1 {
private String name;
private int population;
public Test1(String N, int population) {
this.name = N;
this.population = population;
}
public String getName() {
return name;
}
public int population() {
return population;
}
@Override
public String toString() {
return name + String.valueOf(population);
}
public static void main(String[] args) {
// 构造一个比较器
Comparator<Test1> comparator = new Comparator<Test1>() {
@Override
public int compare(Test1 o1, Test1 o2) {
if (o1.population == o2.population)
return 0;
else if (o1.population > o2.population)
return -1;
else {
return 1;
}
}
};
// 通过构造的比较器来new一个优先级队列。
PriorityQueue<Test1> priority = new PriorityQueue<>(comparator);
priority.add(new Test1("beijing", 960000));
priority.add(new Test1("shanghai", 657000));
priority.add(new Test1("wuhan", 576200));
priority.add(new Test1("xianning", 241000)); // 向队列中插入一个元素,和offer()函数用法相同,但是add()插入异常时会抛出异常,而offer()插入异常是会返回false.
boolean flag = priority.offer(new Test1("dongbei", 475120));
System.out.println(flag);
System.out.println(priority.element()); // 在优先级队列中取堆顶元素,但不删除元素。和peek()的效果一样,但是element()取元素失败会抛出异常,而peek()则会返回nullSystem.out.println(priority.peek());
System.out.println(priority);
priority.remove(); // 删除堆顶元素,和poll()方法效果一样,但是remove()方法失败是抛出异常,而poll()则会返回null
System.out.println(priority);
priority.poll();
System.out.println(priority);
}
}
/*
输出:
true
beijing960000
beijing960000
[beijing960000, shanghai657000, wuhan576200, xianning241000, dongbei475120]
[shanghai657000, dongbei475120, wuhan576200, xianning241000]
[wuhan576200, dongbei475120, xianning241000]
*/