Почему я не вижу все переменные в отладчике? - PullRequest
0 голосов
/ 21 сентября 2018

Intellij IDEA debugger

Привет всем!

Я попытался отладить TreeSet<String> / TreeMap<String>, но обнаружил, что отладчик по какой-то причине не хочетпокажи мне parent и left / right дочерние узлы.

Я ожидал увидеть вложенные узлы, но отображаются только ключи / значения.Конечно, если я оценю this.left / this.right, это даст мне ребенка.

Это ошибка IDEA?Почему он показывает только ключ и значение?

Также я заметил, что когда мы получаем элементы из клиентского кода, мы получаем String вместо TreeMap.Entry.Что мы должны сделать, чтобы получить parent / left / right текущего элемента в коде клиента?

Ответы [ 2 ]

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

Некоторые IDE имеют возможность отображать содержимое коллекции более «дружественным» способом, чем отображение внутренних структур данных коллекции.Вероятно, так, потому что большинство программистов используют коллекций, но не отлаживают их, и поэтому видение внутренних структур коллекции скрывает содержимое коллекции.

В NetBeans этопараметр можно изменить, перейдя в «Предпочтения» в категории «Java> Java Debugger» и установив различные «средства форматирования», такие как «Collection», «Map» и «Map.Entry».

В IntelliJ IDEA откройте диалоговое окно «Настройки».и найдите в разделе Построение, выполнение, развертывание -> Отладчик -> Представления данных -> Java.Опция называется «Включить альтернативное представление для классов коллекций».(Спасибо, Мэтт Лейдхольм!)

Что касается второй части вашего вопроса, если вы используете TreeMap<K, V>, API предоставляет только те типы K и V, которые вы используете.Структура TreeMap.Entry является внутренней структурой данных, которая хранится в тайне от клиента.Клиент не может перемещаться по древовидной структуре (слева / справа / родитель).Цель TreeMap состоит не в том, чтобы представить древовидную структуру, а в том, чтобы предоставить абстракцию карты, ключи и значения которой открыты, отсортированы по ключу.

Вы можете получить Map.Entry ссылки по телефону entrySet().Это ссылки на реальные TreeMap.Entry объекты.Тем не менее, Map.Entry не отображает левый / правый / родительский;он предоставляет только ключи и значения.

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

Вы используете TreeMap, поэтому у вас есть ключ / значения, и он сортируется по ключам, как если бы все ключи были в TreeSet, а TreeSet не ссылается на двоичное дерево с родительским/ left / rigth как

   parent
     |
   node
  /    \
left  right

A TreeSet - это ordered set, следующие правила как natural order или custom comparator


Документация TreeSet : реализация NavigableSet, основанная на TreeMap.Элементы упорядочиваются с использованием их естественного порядка или с помощью Comparator, предоставляемого во время создания набора, в зависимости от того, какой конструктор используется.

Таким образом, TreeMap - это TreeSet, где вы просто добавляетезначение для каждой клавиши

...