Java:如何在三元运算符中访问实例变量?

时间:2018-09-28 03:29:34

标签: java priority-queue ternary-operator

这是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;
            }
        });

4 个答案:

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

这有效。