java - Java Lambdas:带有 PriorityQueue 的比较器
问题描述
考虑一个优先队列
PriorityQueue<Integer> heap = new PriorityQueue<Integer>();
我可以在这里以两种方式定义比较器,一种是使用lambda
,另一种是使用Comparator()
类
假设对这两种方式的 2 个变量进行简单的整数比较,我想知道哪个变量是我们要比较的值,哪个变量包含队列中的现有值
例如:
PriorityQueue<Integer> heap = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
System.out.println(a+" "+b);
return b-a;
}
});
当我调用heap.add(2)
后跟 aheap.add(3)
时,第二个add()
调用触发compare(a,b)
函数并打印a=3 & b=2
,这意味着这里a
有新值并且b
是队列中的现有值
同样,你能告诉我下面的 lambda 表达式是否会类似地工作,还是相反?
PriorityQueue<Integer> heap = new PriorityQueue<Integer>((a,b) -> b-a);
我知道这个问题可以用更简单的方式写出来,但我现在无法做到。
另外,这两个打印相同的值,即降序 4,3,2,1
PriorityQueue<Integer> heap2 = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
// System.out.println(a+" "+b);
return b-a;
}
});
PriorityQueue<Integer> heap = new PriorityQueue<Integer>(
(a,b) -> b-a
);
heap.add(1);
heap.add(2);
heap.add(3);
heap.add(4);
heap2.add(1);
heap2.add(2);
heap2.add(3);
heap2.add(4);
while (!heap.isEmpty()) {
System.out.println(heap.poll()+" "+heap2.poll());
}
解决方案
您定义的两种方法Comparator
是等效的。您的 lambda 版本实际上在编译后扩展为另一个版本,因为Comparator
它是一个功能接口。
这是在接口Comparator
上使用静态工厂方法来定义您的第三种更短的方法:Comparator
PriorityQueue<Integer> heap3 = new PriorityQueue<>(Comparator.reverseOrder());
推荐阅读
- python - Pytest 获取测试结果并将测试通过或失败上传到 Jira
- reactjs - 无法加载要扩展的配置“react-app”。引用自:C:\\package.json
- reactjs - 面对这个错误,同时启动反应 js 应用程序
- graphql - Laravel Lighthouse - 字段指令执行顺序
- user-defined-functions - 雪花不支持的子查询类型无法在 UDF 标量中进行评估
- node.js - 使用 nodemailer 将内联图像移动到附件
- r - 根据值的第一部分的模式在列中排列/排序值
- c - 有没有一种有效的方法可以在恒定空间中的有序范围数组中找到最频繁的数字
- angular - 如何在构建创建期间解决离子问题
- javascript - JavaScript AddEventListener 不适用于所有容器