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

Java:如何访问三元运算符中的实例变量?,java,priority-queue,ternary-operator,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 <

这是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);
PriorityQueue heap=new PriorityQueue(lists.length,
(l1,l2)->l1.val
但我得到了“找不到符号:变量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;
            }
        });
PriorityQueue queue=new PriorityQueue(lists.size(),new Comparator()){
@凌驾
公共整数比较(ListNode o1、ListNode o2){

如果(o1.val您缺少右侧的菱形运算符,这使得编译器无法将参数类型推断为
ListNode
(它将其推断为对象,因此您无法访问
val

试试这个

 PriorityQueue<ListNode> heap = new PriorityQueue<>(lists.length,
            (l1, l2) -> l1.val < l2.val ? -1 :
                    l1.val == l2.val ? 0 :
                            1);

int-val
更改为
public int-val

或者制作一个getter方法并使用它


@user7有一个正确的答案,但我在此建议一个不同的最佳实践:

ListNode
上实现接口
Comparable
,并将比较功能放在
ListNode
类实现中。然后使用

new PriorityQueue<ListNode>()
newpriorityqueue()

它将使用元素的“自然顺序”

我找到了答案。这是一个语法错误

PriorityQueue<ListNode> heap = new PriorityQueue<>(lists.length,
            (l1, l2) -> l1.val < l2.val ? -1 :
                        l1.val == l2.val ? 0 :
                        1);
PriorityQueue heap=new PriorityQueue(lists.length,
(l1,l2)->l1.val

这是有效的。

public int-val;
您将其作为包级别。还有
Integer.compare(l1.val,l2.val)为什么我被允许在三元运算符之外访问它们?我看到一个编辑。检查下面的答案。它建议实现可比较的接口并将比较方法放入ListNoad中。比较器是一个不同的东西,具有相似的意图。谢谢。我的问题是语法错误。我忘了在PAR之前加上。enthesis@JohnTravicks但我可以在三元运算符之外访问它们。我可以创建一个ListNode对象,并在它之外访问它的变量。很可能,您尝试从同一个包或命名空间访问val,而
PriorityQueue
声明位于不同的PackageHanks中。我在LeetCode上执行此操作,所以我没有访问那些东西。也要感谢那些否决我的人。这就是为什么我讨厌在这里提问。@Johntravick我没有否决顺便说一句。人们在这里提问之前需要做一些研究。如果你试图搜索错误,你会得到这个答案。但我可以理解,你被误导了,认为这是由于错误三元运算符。您能解释一下为什么我的编辑中的解决方案有效吗?与三元运算符相比,访问val的方式有什么不同?谢谢。我发现我的问题是语法错误。我忘记在括号之前添加了。遗忘不是语法错误。它可以帮助编译器理解您尝试执行的操作。但是,是的,使用遗传学将帮助编译器(也将帮助开发人员):)。在这种情况下使用Compariable。仍然是首选方法:这样ListNode就知道自己相对于其他ListNode的优先级。而不是创建队列的“外部程序”。PS:在我的回答中也添加了泛型:)谢谢。原来我的问题是语法错误。我忘了在括号前加上了。我也错过了
new PriorityQueue<ListNode>()
PriorityQueue<ListNode> heap = new PriorityQueue<>(lists.length,
            (l1, l2) -> l1.val < l2.val ? -1 :
                        l1.val == l2.val ? 0 :
                        1);