【问题标题】:Understanding TreeMaps了解 TreeMap
【发布时间】:2012-03-03 21:25:31
【问题描述】:

这是一个关于树图的菜鸟问题。我已经阅读了 Java API 和其他文档,但仍然不清楚它是如何工作的。

据我了解,Java(或任何语言)中的树有点像家谱;你在哪里说:

Layer 1                               OldestGuy    
Layer 2       OldGuy1       Oldguy2         OldGuy3        OldGuy4           OldGuy5
Layer 3   Guy1 Guy2 Guy3 Guy4 Guy5  Guy6........ etc

其中第 1 层有 1 个值(即中心节点),从那里可以在每个后续层中存在任意数量的值(或 Guys),并且一些“分支”可能比其他“分支”更长(例如它可以去 OldestGuy -> OldGuy1 -> Guy1 & Guy2...Guyn 而同时另一个分支只是 OldestGuy -> OldGuy4)

考虑到这一点,我试图在特定分支的特定位置向 TreeMap 添加值,同时进行特定连接,但我似乎得到的结果与 HashMap 相同。

(似乎我想要做的不仅仅是 TreeMap ......因为键(或层(?)对于几个不同的值是相同的)

任何建议/解释都会很棒,因为我觉得这棵树好像是在认真地吠叫错误的树。

我已经看到使用 googles .jar 完成此操作的示例(例如家谱),但我只是想理解这一点,因为 TreeMap 和 Trees 之间似乎存在很多冲突,以及如何将数据存储在他们。

【问题讨论】:

  • +1 表示找错树了。

标签: java map treemap


【解决方案1】:

TreeMap 只是Map 的一个实现,恰好在幕后使用了红黑树。树的详细信息不会暴露给您,因此您不能将元素存储在任意位置。

换句话说,TreeMap 不是通用的树数据结构。如果那是您真正想要的,不妨看看这个 Stack Overflow 问题:Java tree data-structure?

【讨论】:

  • 感谢各位的解释,我想我被挂在了树部分,希望有办法去特定的节点。猜猜是时候了解 JTree = D
【解决方案2】:
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable
  • Tree Map 不使用散列来存储键。它使用红黑 树(自平衡二叉搜索树。)。
  • TreeMap 根据其键的自然顺序进行排序。树图将始终对所有元素进行排序
  • 树图的工作基于树数据结构
  • 树图未同步,因此不是线程安全的
  • Java 中的 Tree Map 不允许空键,但允许多个空值

Tree Map的工作基于树数据结构。

  • 每个节点有 3 个引用:PARENT、LEFT 和 RIGHT。
  • LEFT 元素总是小于父元素。
  • RIGHT 元素总是大于或等于父元素。

【讨论】:

    【解决方案3】:

    Java TreeMap 使用树作为内部数据结构来获取 O(log n) 查找和插入,但不会在其接口中公开其树结构。因此,例如,无法获取树节点及其所有后代,或使用它来表示家谱。

    【讨论】:

      【解决方案4】:

      TreeMapMap(通过树实现),而不是树(通过 Map 或其他方式实现)。

      【讨论】:

        【解决方案5】:

        我认为你混淆了两个不同的东西。 TreeMap 被实现为 红黑树
        根据 Java 文档:

        基于红黑树的 NavigableMap 实现。地图已排序 根据其键的自然顺序,或通过比较器 在地图创建时提供,具体取决于使用的构造函数。

        此实现为 containsKey、get、put 和 remove 操作。算法是 改编自 Cormen、Leiserson 和 Rivest 的引言 到算法。

        因此,本质上,如果您想对键进行可预测的排序,您应该让 TreeMap 使用自然排序来对键进行排序,或者自己实现 Comparator 接口。同样,来自 Javadoc:

        请注意,树形图维护的顺序与任何排序图一样, 并且无论是否提供了明确的比较器,都必须是 如果要正确实现此排序映射,则与 equals 一致 地图界面。 (请参阅 Comparable 或 Comparator 以获得精确的 与等于一致的定义。)这是因为 Map 接口是根据equals操作定义的,但是一个排序的 map 使用它的 compareTo(或比较)执行所有键比较 方法,因此该方法认为相等的两个键是,来自 排序图的立场,相等。排序地图的行为是 定义明确,即使它的顺序与equals不一致;它只是 不遵守 Map 接口的一般约定。

        现在,尚不清楚您是想以我提到的方式(即自然顺序)还是其他方式(即插入顺序或其他方式?)放置密钥。
        例如,如果您更喜欢插入顺序,LinkedHashMap 可能会更适合您的情况。
        如果是其他情况,请说明:]。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-14
          • 1970-01-01
          相关资源
          最近更新 更多