Java: Как получить доступ к переменной экземпляра в тройном операторе? - PullRequest
0 голосов
/ 28 сентября 2018

Это класс 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 голосов
/ 28 сентября 2018

Я нашел ответ.Это была синтаксическая ошибка.

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

Это работает.

0 голосов
/ 28 сентября 2018

измените int val на public int val

или создайте метод получения и используйте его

    public class ListNode {
         public int val;
         ListNode next;
         ListNode(int x) { val = x; }
     }
0 голосов
/ 28 сентября 2018

@ user7 имеет правильный ответ, но я бы предложил другую лучшую практику:

Реализуйте интерфейс Comparable<ListNode> на ListNode и поместите функцию сравнения в реализацию класса ListNode.Тогда просто используйте

new PriorityQueue<ListNode>()

И он будет использовать «естественный порядок» элементов

0 голосов
/ 28 сентября 2018

С правой стороны отсутствует оператор diamond, из-за которого компилятор не выводит тип аргумента как ListNode (он выводит его как объект и, следовательно, вы не можете получить доступ к val)

Попробуйтеthis

 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...