如何使用lambda表示法创建具有初始容量和自定义比较器的优先级队列?

时间:2018-05-15 21:05:06

标签: java

我正在使用Java 10,我正在尝试创建一个简单的优先级队列。初始容量应为8(为了参数),优先级应该是数组prior中的值。我试着用

private double[] prior;
private PriorityQueue<Integer> queue;
queue = new PriorityQueue<Integer>(8, (int v, int w) -> Double.compare(prior[v], prior[w]));

在我的代码中,但这不起作用。我总是得到错误&#34; 构造函数PriorityQueue((int v,int w) - &gt; {})未定义&#34;。我究竟做错了什么?这个问题似乎与lambda表达式有关,因为删除它会使错误消失。

1 个答案:

答案 0 :(得分:8)

问题在于intInteger并非完全相同。一个是原始数据类型,另一个是围绕该原始数据类型的Object包装器,而Java 5引入了Autoboxing / Autounboxing来制作代码,这两个代码之间的交换不那么痛苦,它们仍然不正确对待它们就像他们一样。在这种情况下,lambda表达式试图匹配Comparator<int>(不能存在)的定义,并且队列期望Comparator<Integer>,这是有效且合法的。

最简单的解决方案是让lambda表达式推导出参数类型:

PriorityQueue<Integer> queue = new PriorityQueue<>(8, (v, w) -> Double.compare(prior[v], prior[w]));

这应该编译得很好,并按照你的期望做。