繁体   English   中英

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

[英]Print a nodes elements in java generic binary search tree

我仍在尝试学习在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");
        }
    }
}

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

线程“主”中的异常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());
        }

但是,当我运行程序并删除if语句时,该条件将不是True,那么我仍然在Node n =(Node)t.element;上得到java.lang.ClassCastException;

首先, Node应该实现Comparable< Node > ,而不是Comparable< Object > 仅凭这一更改,编译器就可以通过比较错误的事物来防止出现问题,而这正是您的运行时错误所提示的问题。 尽早捕获这些东西是泛型的重点。 如果您的作业禁止修改此类,则应通知您的教授或助教该类存在缺陷。 类强制转换异常可能来自对compareTo的调用,这意味着问题不是尝试打印出信息,而是尝试首先填充树,因为插入元素会导致某些问题。进行比较。

其次,不要使用看起来像实际类名( AnyType )的类型变量。 我见过一些问题,这些问题的原因完全与废除该公约有关,至少每周一次在SO上回来。 如果可能,请使用单个大写字母,例如T

第三,我注意到您正在尝试使用原始类型BinarySearchTree实例而不是BinarySearchTree< AnyType >实例在HashedBSTs内初始化后备列表,从而迫使您在整个地方进行转换。 如果做对了,那么在任何地方都不需要一个演员表。 Node应改为AnyType (或更好的类型变量名)无处不在里面HashedBSTs ,你将需要添加相同的约束AnyType在定义HashedBSTs您已在定义中使用BinarySeaerchTree (即认为AnyType具有可比性本身)。

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

您是否可能误解了作业?

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

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

我认为这种误解的原因是,如果Node是可以是任何类型的事物,那么在HashedBSTs ,除了Object的方法(如toString()HashedBSTs您将无法查询树的内容。 例如,除非知道树中的NodeNode ,否则根本不可能尝试调用getFrequency() AnyType不一定具有getFrequency()方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM