我正在使用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表达式有关,因为删除它会使错误消失。
答案 0 :(得分:8)
问题在于int
和Integer
并非完全相同。一个是原始数据类型,另一个是围绕该原始数据类型的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]));
这应该编译得很好,并按照你的期望做。