Java 通用编程,通用数据结构

Java 通用编程,通用数据结构,java,data-structures,generic-programming,Java,Data Structures,Generic Programming,我正在尝试实现一个二进制搜索树,如果我使用java中的通用编程,那么这个树应该能够存储任何类型的数据,例如int、字符串或基本上任何其他对象。但是这样一个类的问题在于对函数进行编码,例如,如果我对addToTree函数进行编码,那么“您应该限制BinarySearchTree的泛型类型 class BinarySearchTree<T extends Comparable<? super T>> class BinarySearchTree我想我明白你的意思了。通常,设

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

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

class BinarySearchTree我想我明白你的意思了。通常,设计良好的类(可能是你在JDK中使用过的所有标准类)实现
Comparable
并重写内置的
compareTo
方法,该方法定义and==操作的工作方式。如果大于,则返回1;如果等于,则返回0;如果小于,则返回1

如果您希望创建自己的类以放入二叉树,那么是的,您必须实现
Comparable


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

的类,以完成其他答案:

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

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


看看,这就是这样一个搜索树。这个
Set
实现提供了两个构造函数:一个用于可比较的对象。另一个用于该任务的比较器,用于不可比较的对象。

首先,不能将基元类型用作ge的参数nerics(因此,不能使用“”和其他运算符).Secondary,您应该将集合绑定到实现Comparable的类,并使用compareTo方法,这应该可以做到。您不能对泛型使用算术运算符。如果需要对象比较,则泛型类型必须限制为
或任何其他通用类型基(通常为接口)您将创建实现逻辑。或者,您必须像TreeSet一样,将比较委托给在构建二叉树时定义的比较器。为什么不看看它的文档和代码?因此,您的意思是
java.util.List
设计得不好,因为它没有实现
Comparable
?Comparison只对非常有限的类子集有意义。@二元搜索树中的heuster插入需要排序,这就是需要比较元素的原因。.在编写addToList之类的基本函数时,不需要比较list类元素,因此list不需要可比性。
list
与c实际上不相关比较,但我想我的措辞没有我能做到的那么精确。我的意思是,数据类通常实现可比性。它应该是
BinarySearchTree@JBNizet出于好奇..为什么不使用raw comparable?因为您将失去泛型类型提供的类型安全性。就像您不使用
ArrayList一样
存储字符串,但
ArrayList