Java: 如何在三元运算符中访问实例变量?
Java: How to access an instance variable in a ternary operator?
这是列表节点class:
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);
但我得到 "cannot find symbol: variable 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;
}
});
您缺少右侧的菱形运算符,这使得编译器无法将参数类型推断为 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
是包私有的。将其设置为 public 将解决问题,但这不是一个好的做法。相反,为它添加一个 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);
将int val
更改为public int val
或者制作一个getter方法并使用它
public class ListNode {
public int val;
ListNode next;
ListNode(int x) { val = x; }
}
@user7 有一个正确的答案,但我会在这里建议一个不同的最佳实践:
在ListNode
上实现接口Comparable<ListNode>
并将比较函数放在ListNode
class 实现中。然后只需使用
new PriorityQueue<ListNode>()
并且它将使用元素的“自然顺序”
我找到了答案。这是一个语法错误。
PriorityQueue<ListNode> heap = new PriorityQueue<>(lists.length,
(l1, l2) -> l1.val < l2.val ? -1 :
l1.val == l2.val ? 0 :
1);
这有效。
这是列表节点class:
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);
但我得到 "cannot find symbol: variable 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;
}
});
您缺少右侧的菱形运算符,这使得编译器无法将参数类型推断为 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
是包私有的。将其设置为 public 将解决问题,但这不是一个好的做法。相反,为它添加一个 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);
将int val
更改为public int val
或者制作一个getter方法并使用它
public class ListNode {
public int val;
ListNode next;
ListNode(int x) { val = x; }
}
@user7 有一个正确的答案,但我会在这里建议一个不同的最佳实践:
在ListNode
上实现接口Comparable<ListNode>
并将比较函数放在ListNode
class 实现中。然后只需使用
new PriorityQueue<ListNode>()
并且它将使用元素的“自然顺序”
我找到了答案。这是一个语法错误。
PriorityQueue<ListNode> heap = new PriorityQueue<>(lists.length,
(l1, l2) -> l1.val < l2.val ? -1 :
l1.val == l2.val ? 0 :
1);
这有效。