【问题标题】:Why Java Collections API does not have Tree implementation [closed]为什么Java Collections API没有树实现[关闭]
【发布时间】:2012-01-28 08:06:51
【问题描述】:

只是出于好奇,我最近不得不为我的一个程序使用一棵树,我不得不自己构建一棵二叉树,但是为什么 Collections API 没有树的默认实现(甚至二叉树)?

我认为他们决定不将其包含在集合 API 中应该有一些充分的理由。

【问题讨论】:

  • TreeSet 和 TreeMap 是由二叉树备份的两个集合。
  • 我不只是在谈论二叉树,为什么我们没有一个通用的树实现,一个树接口?
  • 有很多外部库,它们提供了这种功能,而不是它本可以包含在 Collections API 本身中,我的问题是为什么它没有作为一般数据结构包含在 Collection API 中java.?
  • 你需要问问詹姆斯·高斯林。这里没有人能以任何权威回答你的问题。任何人不得不说的任何事情都只是猜测和意见。
  • @BrianRoach 不是 James gosling。我们需要问问 Joshua Bloch:)

标签: java data-structures collections


【解决方案1】:

我认为他们决定不将其包含在集合 API 中应该有一些充分的理由。

我认为原因是没有人想出一个很好的树 API

  • 通用性足以涵盖广泛的用例,并且
  • 足以补偿通用的性能开销。

(你在哪里停下来?树?二叉树?N叉树?DAG?图?)

值得注意的是,Apache Commons Collections 或 Google Collections(又名 Guava)都没有树 API。然而,关于这个话题有一个活跃的 Guava 问题 - http://code.google.com/p/guava-libraries/issues/detail?id=174 - 很明显,至少一些人同意你的观点。

更新

从 15.0 版开始,Guava 现在以 TreeTraverserBinaryTreeTraverser 类的形式支持树。但这可能不是您所期望的。事实上,这些类实际上并没有实现树数据结构。相反,您必须在泛型类型参数中执行此操作。此外,Traverser 类甚至避免对节点类型的 API 做出假设。它们通过作为抽象类来做到这一点,并且需要具体的遍历器子类型来实现询问树的操作;例如获取节点的子节点。


FWIW、TreeMapTreeSet 不是“树 API”。它们是MapSet API 的基于树的实现。树性完全被公共 API 隐藏,使得这两个类完全不适合用作通用树。

【讨论】:

    【解决方案2】:

    恕我直言,理论上,树不是一种集合,它只是一种实现。我的意思是有抽象集合,例如 Set(无序的条目集)、List(有序的条目集)、Map(两组条目之间有关系),还有它们的实现:数组、列表(例如 ArrayList 和 LinkedList )、HashSet等,各有优缺点。因此,Tree 只是其中一种实现方式(例如,对于列表),它可以为您(大致)提供比数组更快的搜索,但不能通过索引访问。

    顺便说一句,Java 中有 TreeMap(“基于红黑树的 NavigableMap 实现”)和 TreeSet(“基于 TreeMap 的 NavigableSet 实现”)类。

    【讨论】:

    • 这个。集合不是由它们的数据结构定义的,而是它们对插入、删除和查找性能的承诺。实现的细节应该是无关紧要的,您根据您的使用要求选择容器。例如,如果您需要一个元素始终排序的容器,并且查找应该是 O(log n),那么您需要一个 Set 或 SortedMap。实现如何满足性能保证并不重要。
    • 我不同意。集合由它们的合同定义。 Sets 不保证顺序(因此没有索引访问),但保证没有重复。 Lists 保证订单,但允许重复。 Maps 包括元素之间的关系。您可以使用 Trees 来实现其中的一些(全部?)这一事实是无关紧要的。例如,您可以使用List 来实现Set(例如LinkedHashSet)。实现树的方法也不止一种。
    【解决方案3】:

    java.util.TreeMap 是红黑树的实现。

    【讨论】:

    • 我知道 TreeMap 存在,但它是一种更具体的树数据结构形式,为什么我们没有更通用的树实现,就像 List 和 Set 一样。为什么 Collections API 的创建者决定不给出树的通用形式。?也许他们可以给出一个接口 Tree 及其实现为 BinaryTree、AVLTree、RedBlackTree?
    • 我同意 Artem Zh. 的回答。树只是一种特定形式的数据结构,用于保存实体的“集合”。
    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2013-11-16
    • 2010-10-12
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多