使用方法可以参考leetcode 347题,具体解题思路不在赘述,本文重点以347题为实例讲讲PriorityQueue的比较。
第一种比较方法 定义比较方法
新建一个私有类,在私有类中定义比较的方法。由于java.util包中自带的PriorityQueue本身是由最小堆构成的,而本题需要的恰好是保留最大元素,所以定义比较方法如下所示。
private class Freq implements Comparable<Freq> {
int num;
int freq;
public Freq(int num, int freq) {
this.num = num;
this.freq = freq;
}
@Override
public int compareTo(Freq another) {
if (this.freq > another.freq)
return 1;
else if (this.freq == another.freq) {
return 0;
} else {
return -1;
}
}
}
第二种比较方法 定义比较器
自己写一个比较器Comparator(注意不同于Comparable),传入到PriorityQueue中。这也是由于PriorityQueue的定义方法可以传入一个比较器。
private class Freq{
int num;
int freq;
public Freq(int num, int freq){
this.num = num;
this.freq = freq;
}
}
private class FreqComparator implements Comparator<Freq>{
@Override
public int compare(Freq a, Freq b){
return a.freq - b.freq;
}
}
...
PriorityQueue<Freq> pq = new PriorityQueue<>(new FreqComparator());
第三种方法 匿名类
使用匿名类的方式缩短代码。使用这种方式时可以避免编写节点类以及比较器类。注意此时PriorityQueue中的参数是Integer,后续的代码也需要稍做更改,但整体上不麻烦。
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){
@Override
public int compare(Integer a , Integer b){
return map.get(a) - map.get(b);
}
});
第四种方法 Java8新特性
使用Lambda表达式
PriorityQueue<Integer> pq = new PriorityQueue<>(
(a, b) -> map.get(a) - map.get(b)
);