在java通用二进制搜索树中打印节点元素

时间:2014-03-17 17:19:20

标签: java generics

我仍然在尝试学习使用java中的泛型的一些细微差别,我有点想要打印一些Node类型的元素,它保存了我的二叉搜索树的二进制节点的实际数据。

这是我最基本的节点类,它包含BinaryNodes数据

public class Node implements Comparable<Object> {

private String word;
private int frequency;

public Node(String word) {
    super();
    this.word = word;
    this.frequency = 1;
}

public String getWord() {
    return word;
}

public void setWord(String word) {
    this.word = word;
}

public int getFrequency() {
    return frequency;
}

public void setFrequency(int frequency) {
    this.frequency = frequency;
}

public void incrementFrequency() {
    this.frequency++;
}

@Override
public String toString() {
    return "Node [word=" + word + ", frequency=" + frequency + "]";
}

public int compareTo(Object x) {
    Node that = (Node) x;
    return this.getWord().compareTo(that.getWord());
}

public boolean startsWith(Object x) {
    Node that = (Node) x;
    return that.getWord().startsWith(this.getWord());
}
}

组成二叉搜索树的实际节点的类是BinaryNode类,其设置如下

public class BinaryNode <AnyType> {
AnyType element; //the data in the node 
BinaryNode<AnyType> left; //left child
BinaryNode<AnyType> right; //right child

BinaryNode(AnyType theElement){
    this(theElement, null, null);
}

BinaryNode(AnyType theElement, BinaryNode<AnyType> lt, BinaryNode<AnyType> rt){
    element = theElement;
    left = lt;
    right = rt;
}
}

接下来我有我的BinarySearchTree类,它被设置为

public class BinarySearchTree <AnyType extends Comparable<? super AnyType>> {

//the root of the tree
BinaryNode<AnyType> root; 

接下来是获取和打印根,插入和其他一些的方法..

最后我有我的HashedBST类,其中包含一个ArrayList,每个索引都包含自己的BST。

public class HashedBSTs<AnyType> {

private ArrayList <BinarySearchTree<Node>> table;

public HashedBSTs(int size){
    table = new ArrayList<BinarySearchTree<Node>>(size);
    for(int i = 0; i < size; i++){
        table.add(new BinarySearchTree());
    }
}
    public void printHashCountResults(){
    for(BinarySearchTree<Node> BST : table){
        if(BST.root != null){
            //Node n = (Node)BST.root.element;

            //int freq = BST.root.element.getFrequency();
            //String word = "";
            //int numNodes = 0;
            //System.out.println("This tree starts with Node "
            //+"[word="+word+", frequency="+freq+"] and has "+numNodes  +"nodes");

            BinaryNode<AnyType> bn =  (BinaryNode<AnyType>) BST.getRoot();
            Node n = (Node) bn.element;
            System.out.println(n.toString());
        }else{
            System.out.println("this tree has no nodes");
        }
    }
}

无论我尝试采用哪种方法来访问和打印最基本的数据节点数据的信息,我最终都会

线程“main”中的异常java.lang.ClassCastException:java.lang.String无法强制转换为proj2.Node 任何有关我应该如何做到这一点的帮助将不胜感激。

编辑:

所以我厌倦了根据答案改变我的一些课程的设置,但我仍然遇到了和以前一样的障碍。

在我的HashedBSTs类中,我将类结构和构造函数更改为

public class HashedBSTs<AnyType extends Comparable<? super AnyType>> {

private ArrayList <BinarySearchTree<AnyType>> table;

public HashedBSTs(int size){
    table = new ArrayList<BinarySearchTree<AnyType>>(size);
    for(int i = 0; i < size; i++){
        table.add(new BinarySearchTree<AnyType>());
    }
}

但是,我仍然遇到试图在另一个类中访问Node类方法的同一问题。一些建议是改变我的Node类的设置,但我不能这样做。 Node类是一个用于构建的类,我无法修改该类。

接下来我尝试了一些新方法,例如

        if(t.element instanceof Node){
            Node n = (Node) t.element;
            int freq = n.getFrequency();
            System.out.println("Frequency: "+freq);
            System.out.println(t.toString());
            System.out.println(((Node) t.element).toString());
        }

但是当我运行程序时,条件不会为True,当我删除if语句时,我仍然在Node n =(Node)t.element;

上获得java.lang.ClassCastException

1 个答案:

答案 0 :(得分:3)

首先,Node应该实现Comparable< Node >,而不是Comparable< Object >。仅仅这一改变将允许编译器防止比较错误类型的问题,这正是运行时错误所暗示的问题。早期捕捉这些东西是仿制药的全部要点。如果您的作业禁止修改此课程,您应该通知您的教授或TA这个课程有缺陷。类转换异常可能来自对compareTo的调用,这意味着问题不是打印信息的尝试,而是首先尝试填充树,因为插入元素是将导致一些比较。

其次,不要使用看起来像实际类名AnyType)的类型变量。我已经看到了一些问题,其原因完全与违反这一公约有关,每周至少回复一次。如果可能,请使用单个大写字母,如T

第三,我注意到您正在尝试使用原始类型HashedBSTs而不是BinarySearchTree的实例初始化BinarySearchTree< AnyType >中的支持列表,迫使您在整个地点。 如果您正确地执行此操作,则无需在任何地方进行单独投射。 Node应替换为AnyType(或更好的类型变量名称)。 {1}},您需要在HashedBSTs的定义中AnyType添加相同的约束HashedBSTs(即BinarySeaerchTree AnyType与自己相比)。

最后,您没有向我们展示的一件事是您用来填充树进行测试的代码。由于您允许二进制树类完全保留任何类型,因此我猜您使用String而不是Node来填充树。因此,instanceof测试失败并不奇怪。

你有可能误解了这项任务吗?

Node类保存数据。给定的示例是Node String,但如果数据本身是通用的,那么变量应该是。

public class Node< T extends Comparable< ? super T > >
implements Comparable< Node< T > > {
    T data;
    int frequency;
    // ...
}

我假设这种误解的原因是,如果Node是可以是任何类型的东西,那么在HashedBSTs内你将无法审问树的内容,除了Object的方法(如toString())。例如,除非您知道树中的节点是getFrequency() s,否则您无法尝试调用NodeAnyType不一定有getFrequency()方法。