为什么在调试器中看不到所有变量?

时间:2018-09-21 17:13:25

标签: java collections set treemap treeset

Intellij IDEA debugger

大家好!

我尝试调试TreeSet<String> / TreeMap<String>,但是发现调试器由于某种原因不想让我看到parentleft / right的孩子的节点。

我希望看到嵌套的节点,但是只显示键/值。 当然,如果我评估this.left / this.right,它将给我孩子。

是IDEA错误吗?为什么只显示键和值?

我还注意到,当我们从客户端代码中获取元素时,我们收到的是String而不是TreeMap.Entry。为了在客户代码中获得当前项目的parent / left / right,我们应该怎么做?

2 个答案:

答案 0 :(得分:3)

您使用的是TreeMap,因此您具有键/值,并且按键对它进行排序,就好像所有键都在TreeSet中一样,而TreeSet并不引用二进制

父/左/右的树
   parent
     |
   node
  /    \
left  right

TreeSet是遵循ordered setnatural order的规则的custom comparator


  

TreeSet Documentation:基于TreeMap的NavigableSet实现。元素使用其自然顺序进行排序,或通过在设置创建时提供的Comparator进行排序,具体取决于所使用的构造器。

所以TreeMap就是TreeSet,您只需在其中向每个键添加一个值

答案 1 :(得分:0)

某些IDE可以选择以更“友好”的方式显示集合的内容,而不是显示集合的内部数据结构。之所以这样,是因为大多数程序员都是使用集合,而不是调试,因此看到集合的内部结构会模糊集合的内容。

在NetBeans中,可以通过以下方法来更改此选项:转到Java> Java Debugger类别中的Preferences,并设置各种“格式化程序”,例如Collection,Map和Map.Entry。

在IntelliJ IDEA中,打开“设置”对话框,然后在“构建,执行,部署->调试器->数据视图-> Java”下查看。该选项称为“为Collections类启用替代视图”。 (谢谢,马特·莱德霍尔姆!)

关于问题的第二部分,如果您使用的是TreeMap<K, V>,则API仅公开您正在使用的类型KVTreeMap.Entry结构是内部数据结构,对客户端不公开。客户端本身无法导航树结构(左/右/父)。 TreeMap的目的不是公开树结构,而是提供公开了键和值(按键排序)的映射的抽象

您可以通过调用Map.Entry获得entrySet()引用。这些是对实际TreeMap.Entry对象的引用。但是,Map.Entry不会显示左/右/父母。它只公开键和值。