我试图创建一个通用的BinarySearchTree<T>
类。我想提供两个选项(构造函数),
实现Comparable<T>
的泛型类的空构造函数,即如果Dog
是实现Comparable<Dog>
的类,则:
BinarySearchTree<Dog> bst = new BinarySearchTree<Dog>();
将Comparator<T>
传递给无需实施Comparable<T>
的通用类,即如果 Dog 是一个类(未实现Comparable<Dog>
)和 DogComp 是一个实现Comparator<Dog>
然后
BinarySearchTree<Dog> bst = new BinarySearchTree<Dog>(new DogComp());
我的BinarySearchTree类中有一个Comparator字段。对于空的consrtuctor,我将创建新的比较器。如果比较器通过,我将简单地将其分配给该比较器字段。
我应该如何声明类和构造函数?
答案 0 :(得分:3)
不考虑将用于决定插入节点的位置的实际逻辑,您可以这样做:
public class BinarySearchTree<T> {
private Node root;
private Comparator<T> comparator;
public BinarySearchTree() {
}
public BinarySearchTree(Comparator<T> comparator) {
this.comparator = comparator;
}
public void insert(T obj) {
// binary search tree logic for deciding where to insert the node
// Create a Node
// ....
// comparison of two nodes
if (obj instanceof Comparable) {
// compare using Comparable
} else if (comparator != null) {
// compare using Comparator
} else {
//objects cannot be compared
}
}
/*Represents a node for the tree */
private class Node {
T obj;
Node left;
Node right;
public Node(T obj) {
super();
this.obj = obj;
}
}
}
另请注意,不是对每个新插入执行instanceOf检查,而是可以在构造函数本身中添加该检查,如果数据未实现可比较或比较,则抛出异常。
答案 1 :(得分:2)
我想改进机器人的答案:
使用抽象BinarySearchTree
方法创建compare
类摘要。然后,两个内部静态具体类可以实现两种方案。而不是构造函数,提供两种构造方法,如:
public static <E> BinarySearchTree<E> create(Comparator<? super E> comp) {
return new ComparatorSearchTree(comp);
}
public static <E extends Comparable<E>> BinarySearchTree<E> create() {
return new ComparableSearchTree();
}
这样,类的其余部分可以只使用你的compare(one,other)方法,而不关心结果是来自比较器还是自然元素顺序。
您可能已经注意到我将comp
指定为Comparator<? super E>
。这意味着比较器逆变。这使得搜索树更加灵活,因为这样您就可以放入任何能够比较E对象的比较器,即使比较器只比较F对象,其中F是E的超类。