这是ListNode类:
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
我正在尝试像这样初始化PriorityQueue:
PriorityQueue<ListNode> heap = new PriorityQueue(lists.length,
(l1, l2) -> l1.val < l2.val ? -1 :
l1.val == l2.val ? 0 :
1);
但是我得到“找不到符号:变量val”。正确的方法是什么?我曾尝试将l1和l2强制转换为ListNode的,但这并没有做任何事情。
编辑:为什么这样做?
PriorityQueue<ListNode> queue= new PriorityQueue<ListNode>(lists.size(),new Comparator<ListNode>(){
@Override
public int compare(ListNode o1,ListNode o2){
if (o1.val<o2.val)
return -1;
else if (o1.val==o2.val)
return 0;
else
return 1;
}
});
答案 0 :(得分:1)
您缺少右侧的菱形运算符,这使编译器无法将参数类型推断为ListNode
(它将其推断为对象,因此您无法访问val
)
尝试一下
PriorityQueue<ListNode> heap = new PriorityQueue<>(lists.length,
(l1, l2) -> l1.val < l2.val ? -1 :
l1.val == l2.val ? 0 :
1);
我的最初答案:
如果您的PriorityQueue声明位于其他软件包中(与声明ListNode
的软件包不同):
与三元运算符无关。变量val
是程序包专用的。将其公开可以解决此问题,但这不是一个好习惯。而是为其添加一个 getter 并将实例变量设为私有(除非您有理由将它们设置为包私有)
public int getVal() {
return val;
}
PriorityQueue<ListNode> heap = new PriorityQueue<>(lists.length,
(l1, l2) -> l1.getVal() < l2.getVal() ? -1 :
l1.getVal() == l2.getVal() ? 0 :
1);
答案 1 :(得分:1)
将int val
更改为public int val
或创建一个吸气方法并使用它
public class ListNode {
public int val;
ListNode next;
ListNode(int x) { val = x; }
}
答案 2 :(得分:1)
@ user7的答案正确,但是我建议在此处使用另一种最佳做法:
在Comparable<ListNode>
上实现接口ListNode
,并将比较函数放入ListNode
类实现中。然后只需使用
new PriorityQueue<ListNode>()
它将使用元素的“自然顺序”
答案 3 :(得分:0)
我找到了答案。这是语法错误。
PriorityQueue<ListNode> heap = new PriorityQueue<>(lists.length,
(l1, l2) -> l1.val < l2.val ? -1 :
l1.val == l2.val ? 0 :
1);
这有效。