【问题标题】:Storing data into an array list and then binary search tree将数据存储到数组列表中,然后二叉搜索树
【发布时间】:2016-03-24 15:39:50
【问题描述】:

我有一个家庭作业,我需要将患者数据加载到一个节点中,然后才能在树中搜索。该节点将存储患者姓名、医生姓名、他们当前的预约以及下一个年度预约日期。数据是从文本文件中读入的。我想使用 arrayList 将数据存储到节点中,但令人困惑的部分是如何将 arrayList 的某些数据存储到每个节点中? (我希望这是有道理的)。我大约一天前发布了一些帮助来创建一个患者类,然后将其存储在节点中,然后存储在数组列表中。但是我仍然迷失在如何实现这一点上。请记住,我在 BST 的 O.o 很糟糕。我选择使用 arrayList 而不是 LinkedList,因为我更喜欢使用它们。 这是我在我的文本文件中读取的类...(数组实现不完整)。

public class readFile {
    private Scanner x;

    public void openFile() {
        try {
            x = new Scanner(new File("patients.txt"));
        } catch (Exception e){
            System.out.println("Couldn't find file!");
        }
    }

    public void readFile() {

        ArrayList<String> data = new ArrayList<String>();   
        while(x.hasNext()) {
            String PatientName = x.next();
            String DoctorName = x.next();
            String currentApp = x.next();
            String NextApp = x.next();
        }
    }

    public void closeFile(){
        x.close();
    }

}

这是我的树类

public class Tree {

    Node root;

    public void addNode(int key, String patientName, String DocName, String currentApp, String nextApp){
        Node newNode = new Node(key, patientName, DocName, currentApp, nextApp);
        if(root == null) {
            root = newNode;
        } else{
            Node currentNode = root;
            Node parent;
            while(true) {
                parent = currentNode;
                if(key < currentNode.key) {
                    currentNode = currentNode.leftChild;
                    if (currentNode == null){
                        parent.leftChild = newNode;
                        return;
                    }
                } else{
                    currentNode = currentNode.rightChild;
                    if (currentNode ==null) {
                        parent.rightChild = newNode;
                        return;
                    }
                }
            }
        }
    }

    public void Traversal(Node currentNode) {
        if(currentNode != null){
            Traversal(currentNode.leftChild);
            System.out.println(currentNode);
            Traversal(currentNode.rightChild);
        }
    }

    public static void main(String[] args){
        Tree binaryTree = new Tree();
        readFile read = new readFile();
        read.openFile();
        read.readFile();
    }
}

class PatientData {
    String patientName;
    String DocName;
    String currentApp;
    String nextApp;

    public PatientData (/*Get parameters*/) {
         /*Set parameters to members*/
    }
}

class Node{
    int key;
    PatientData patient;

    Node leftChild;
    Node rightChild;

    Node(int key, PatientData patient){
        this.key = key;
        this.patient = patient;
    }

}

这是文本文件

Baker, William,     Chavez,     04/01/05,   04/10/06
Sanchez, Jose,      Chavez,     06/15/05,
Anderson, Robert,   Wong,       04/02/05,   03/30/06
Watson, David,      Chavez,     05/03/05,   04/28/06
Chung, Yu,      Gilbert,    07/10/05,
Griffin, Sandy,     Gilbert,    06/20/05,   06/20/06
Marcus, Wendy,      Wong,       08/02/05,   08/03/06
Williams, Rebbeca,  Chavez,     08/10/05,   08/11/06
Kennedy, Fred,      Wong,       07/16/05,   07/15/06
Henderson, Paul,    Wong,       02/15/05,           
Tucker, Matthew,    Wong,       04/10/05,   04/11/06
Coombs, Jean,       Gilbert,    05/01/05,   04/10/06    
Earl, Gary,     Gilbert,    06/03/05,   05/10/06
Atkins, Anthony,    Chavez,     09/10/05,   09/11/06
Garcia, Jesus,      Chavez,     10/10/05,   
David, James,       Wong,       02/02/05,   02/03/06
Young, Ed,      Gilbert,    07/09/05,   07/10/06
Jones, Richard,     Gilbert,    08/01/05,   08/10/06
Peterson, Jerry,    Wong,       06/02/05,   06/03/06
Arnold, Belinda,    Chavez,     01/10/05,   01/11/06
Franklin, Jason,    Wong,       09/12/05,   09/13/06
Trent, Joseph,      Gilbert,    03/12/05,   
Valdez, Tomas,      Gilbert,    10/15/05,   10/10/06
Gent, Charles,      Wong,       10/22/05,   10/11/06
Roper, Joan,        Chavez,     03/10/05,   03/21/06
Lopez, Ricky,       Wong,       03/24/05,   03/25/06
Henry, Sarah,       Gilbert,    04/18/05,   04/17/06
Nathan, James,      Chavez,     06/10/05,   08/11/06
Ulvan, Rachel,      Chavez,     09/10/05,   
Mears, Sally,       Wong,       05/05/05,   
Edwards, Sam,       Gilbert,    05/21/05,   05/22/06
Rubino, Ian,        Gilbert,    07/24/05,   07/21/06
Osborn, Janet,      Chavez,     07/10/05,   07/11/06
Barton, Michael,    Chavez,     10/10/05,   10/16/06
Quinn, Pat,     Gilbert,    08/27/05,   08/29/06
Inglis, Peggy,      Wong,       08/30/05,   08/29/06

【问题讨论】:

  • 发布作业问题。
  • @AnkitShubham,对不起,当你评论这就是我正在做的事情时,哈哈。
  • 需要创建一个Patient implements Comparable类来创建一个合适的BST。
  • @cricket_007 他也可以使用Comparator&lt;Patient&gt;TreeSet 等等。
  • 好的,我看看能不能搞定。

标签: java arrays arraylist binary-tree binary-search-tree


【解决方案1】:

您不需要ArrayList 作为中间存储;我理解分配的方式,你应该直接用文件中的数据填充你的树。因此,只需从文件中读取每个患者并将其添加到树中,如下所示:

public Tree readFile(Tree tree){
    int key=0;
    while(x.hasNext()){
        String patientName = x.next();
        String doctorName = x.next();
        String currentApp = x.next();
        String nextApp = x.next();
        tree.addNode(key++, patientName, doctorName, currentApp, nextApp);
    }
}

我冒昧地介绍了一个基本上只是记录号的密钥。

【讨论】:

  • 好的,我试试这样实现。
  • 请注意,作业建议使用多棵树。对于您当前的Node 课程,这将无法正常工作;我认为您不应该对患者和树节点使用单个类,而是将它们分成仅包含患者数据的 Patient 类和引用 PatientNode 类和两个孩子Nodes。此设置将允许多个树都引用相同的 Patient 实例,但每个树的顺序不同。因此,您还应该添加一种方法来对您的 Tree 类执行节点比较,以便对它们进行有意义的排序。
  • 是的,我知道这是一种糟糕的编码方式。我应该从一开始就分开上课。我也会努力的!谢谢朋友。
【解决方案2】:

分配文本表明您可能应该按约会日期对树进行排序(比较日期而不是键。

您还可以保留 3 棵树,每个医生一棵,例如通过使用地图(如果允许)。

那么操作就很容易实现了:

  • “按医生姓名搜索下周内预约的患者” - 从地图中获取医生的树,然后提取预约日期在现在(今天)和现在 + 7 天之间的子树(节点)
  • “按医生姓名搜索需要每年预约的患者” - 同上,但获取所有预约日期低于现在的 - 1年。
  • “搜索任何患者...”同上,只是在所有 3 棵树中搜索并将结果合并到一个列表中
  • “编辑患者预约” - 这意味着重新使用树,实现此目的的最简单方法可能是删除并重新插入节点(因此您可以重复使用排序代码)
  • “删除患者” - 您需要维护另一棵按姓名/ID 排序的树,并使用预约日期查找其他树中的相应节点(注意:如果日期为是相同的)或只是迭代一棵(全部)树并删除任何匹配的节点

【讨论】:

  • 是的,我正在考虑为每个医生做一棵树。我很感激你的洞察力!
  • @wadeaston 不客气。顺便说一句,不要忘记重新平衡代码,因为树可能会在大量使用时退化为列表。也许你应该在一开始就重新平衡它们,也就是在构建树之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多