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);

这有效。