Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 遍历包含自定义对象的BST_Java_Class_Binary Search Tree - Fatal编程技术网

Java 遍历包含自定义对象的BST

Java 遍历包含自定义对象的BST,java,class,binary-search-tree,Java,Class,Binary Search Tree,如果这是一个愚蠢或不完整的问题,我道歉。一般来说,我对java和OOP比较陌生,我有一个项目需要我使用BST来存储学生数据记录 我创建了一个Student类,该类保存与Student记录相关的变量。我还创建了一个通用的BST类 我的问题是,我如何通过这个BST按姓名搜索学生?当我为这个BST编写代码时,它是在整数或字符串的上下文中使用的,因此我可以轻松地使用BST中保存的整数或字符串作为我编写的get方法的参数中的键 但是,对于自定义学生类,名字和姓氏作为变量存储在类的字段中。不过,存储的对象是

如果这是一个愚蠢或不完整的问题,我道歉。一般来说,我对java和OOP比较陌生,我有一个项目需要我使用BST来存储学生数据记录

我创建了一个Student类,该类保存与Student记录相关的变量。我还创建了一个通用的BST类

我的问题是,我如何通过这个BST按姓名搜索学生?当我为这个BST编写代码时,它是在整数或字符串的上下文中使用的,因此我可以轻松地使用BST中保存的整数或字符串作为我编写的get方法的参数中的键

但是,对于自定义学生类,名字和姓氏作为变量存储在类的字段中。不过,存储的对象是一个学生,我不知道如何在树的get方法的参数中引用特定的学生对象

下面是我的查找-获取方法

/**
 * Internal method to find an item in a subtree.
 *
 * @param x
 *            is item to search for.
 * @param node
 *            the node that roots the tree.
 * @return node containing the matched item.
 */
private Node<T> find(T x, Node<T> node) {
    if (node == null) {
        return null; // Not found
    }
    else if (x.compareTo(node.getElement()) < 0) {
        // Search in the left subtree
        return find(x, node.getLeft());
    }
    else if (x.compareTo(node.getElement()) > 0) {
        // Search in the right subtree
        return find(x, node.getRight());
    }
    else {
        return node; // Match
    }
}

我找到了解决这个问题的办法,虽然我不知道这是不是一个好办法;项目规范要求我保持我的BST通用性。我的实现与我的BST相当,而且我的学生班级的实现也相当。在我的学生课上,我写了一个方法,将一个学生和另一个学生按姓,然后按名进行比较


我创建了一个section类,它扩展了student类型的BST。在我的section类中,我编写了一个自定义搜索方法,该方法基于在自定义搜索方法中传递的名字和姓氏字符串创建一个新的student对象,然后我将该新学生传递到我的通用BST搜索方法中,该方法使用节点的(在本例中为学生的)compareTo方法来遍历BST。

一个可能的解决方案是在节点类中添加一个传统属性:

public class Node<T> {

Node<T> right;
Node<T> left;
Student st;
}

方法compareTo只接受字符串,因此,您要将find方法参数中的Student x.name的名称与节点中包含的学生的特定名称进行比较。从右侧或左侧节点node.getLeft.getStudent.name检索

研究java.util.Comparator接口以及如何使用它为任何类创建自定义比较。@JimGarrison hello,将类节点更改为节点,并将类学生定义为类学生可以解决问题,或者这种方法存在缺陷?@很好,我刚才遇到的一个缺陷是,我只能基于一个属性(即名称)进行排序或搜索,因为compareTo方法只是可用于可比较接口的一种方法。我认为使用comparator接口,我还没有使用它,所以我不确定我可以开始通过多个属性进行搜索,比如通过学生ID或成绩等。希望JimGarrison可以提供一些关于这方面的输入。谢谢你。我最初考虑过这样做,但我的项目规范说要确保BST和节点保持通用性,也就是说,对student类一无所知,反之亦然
public Node<T> getRight() {
    return right;
}
public void setRight(Node<T> right) {
    this.right = right;
}
public Node<T> getLeft() {
    return left;
}
public void setLeft(Node<T> left) {
    this.left = left;
}
public Student getStudent() {
    return st;
}
public void setStudent(Alumno st) {
    this.st = st;
}
    private Node<Student> find(Student x, Node<Student> node) {
    if (node == null) {
        return null; // Not found
    } else if (x.name.compareTo(node.getLeft().getStudent().name) < 0) {
        // Search in the left subtree
        return find(x, node.getLeft());
    } else if (x.name.compareTo(node.getRight().getStudent().name) > 0) {
        // Search in the right subtree
        return find(x, node.getRight());
    } else {
        return node; // Match
    }
}