了解 TreeMap
Posted
技术标签:
【中文标题】了解 TreeMap【英文标题】:Understanding TreeMaps 【发布时间】: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 表示找错树了。 【参考方案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】:TreeMap 是 Map(通过树实现),而不是树(通过 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 可能会更适合您的情况。 如果是其他情况,请说明:]。
【讨论】:
以上是关于了解 TreeMap的主要内容,如果未能解决你的问题,请参考以下文章
Java_JDK_HashMap, HashTable, ConcurrentTable比较