【问题标题】:generic programming, generic data structures泛型编程,泛型数据结构
【发布时间】:2013-12-10 06:47:13
【问题描述】:

我正在尝试实现二叉搜索树,如果我在 java 中使用通用编程,那么这棵树应该能够存储任何类型的数据,例如int,字符串或基本上任何其他对象。但是这样一个类的问题在于对函数进行编码,例如如果我正在编写 addToTree 函数,则“

这个问题对于其他数据结构也是一样的。

【问题讨论】:

  • 首先,不能使用原始类型作为泛型的参数(所以,不能使用''等运算符)。其次,您应该将您的集合绑定到实现 Comparable 并使用 compareTo 方法的类,这应该可以解决问题。
  • 不能对泛型使用算术运算符。如果您需要对象比较,那么您的泛型类型将必须限制为 <T extends Comparable> 或您将为实现逻辑创建的任何其他常见类型基础(通常是接口)。
  • 或者您必须将比较委托给在构造二叉树时定义的 Comparator,就像 TreeSet 一样。为什么不看看它的文档和代码?

标签: java data-structures generic-programming


【解决方案1】:

您应该限制 BinarySearchTree 的泛型类型,

class BinarySearchTree<T extends Comparable<? super T>>

该元素应实现 Comparable 接口,否则您无法对元素进行排序。

编辑:正如@JB Nizet 建议的那样,不要使用原始 Comparable

【讨论】:

  • 应该是BinarySearchTree&lt;T extends Comparable&lt;? super T&gt;&gt;。不要使用原始的 Comparable 类型。
  • @JBNizet 只是出于好奇..为什么不应该使用原始可比性?
  • 因为你会失去泛型类型提供的类型安全性。就像您不会使用 ArrayList 来存储字符串一样,而是使用 ArrayList&lt;String&gt;
【解决方案2】:

我想我明白你在说什么。通常,精心设计的类(可能是您将在 JDK 中使用的所有标准类)实现 Comparable 并覆盖定义 和 == 操作如何工作的内置 compareTo 方法。 compareTo 如果大于则返回 1,如果相等则返回 0,如果小于则返回 -1。

如果你想创建自己的类来放入二叉树,那么是的,你必须实现Comparable

编辑:我下面的回答提出了一个非常重要的观点:如果您打算使用比较,您应该将可能的类类型限制为扩展Comparable

【讨论】:

  • 所以你是在暗示java.util.List 设计不好,因为它没有实现Comparable?比较只对非常有限的类子集有意义。
  • @heuster 在二叉搜索树中插入需要排序,这就是为什么需要比较元素的原因。如果是列表类元素,则不需要比较诸如 addToList 之类的基本函数,所以 list 确实反正不需要比较
  • List 与比较并不真正相关,但我想我的措辞不如我能做的准确。我的意思是数据类通常实现Comparable。
【解决方案3】:

完成其他答案:

实现Comparable 接口只对真正具有自然顺序的类有意义。此外,此排序应与equals 方法一致。实现equalscompareTo 方法听起来比实际上更容易。这应该是精心设计的。

通常,类的对象没有真正的自然排序。但是,您将有任务在特定属性上订购它们。对于此类任务,您可以实现另一个接口:Comparator。然后可以使用比较器根据需要对对象进行排序。

看看TreeSet,就是这样一个搜索树。这个Set 实现提供了两个构造函数:一个是为与可比较的对象一起使用而设计的。另一个使用比较器来完成该任务,并且设计用于与不可比较的对象一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多