1

我正在使用 Java 进行作业,并且遇到了一个相当独特的问题。本质上,我的包中有两个文件:一个用于测试的驱动程序文件,然后是实际的类文件。我想知道如何从驱动程序/测试文件中调用或执行两个类深的语句?(即我们有公共类 Hello,在这个类中我们声明了另一个类,称为公共类 Goodbye。我们想在 Goodbye 中执行语句。)

下面是我的类声明和驱动程序文件的代码。我要执行的功能是 InOrder/PostOrder/PreOrder 类。我什至不确定使用“public void main(String args[])”是否是定义此函数的正确方法。如果您对定义函数的方法有其他建议,我愿意接受建议。

驱动文件:

package binTreeImprovedTwo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;


/**
 * Class TreeTest.
 */
public class TreeTest {

    /**
     * The main method.
     *
     * @param default arguments
     */
    public static void main (String[] args) {
        BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
        BinTree tree = new BinTree();
        int value;
        String loop = "";
        Random randomNumber = new Random();
        System.out.println("Bulding binary tree...");
        for (int i = 1; i <= 10; i++) {
            value = randomNumber.nextInt(100);
            System.out.printf("%d ", value);
            tree.insertNode(tree.root, value);
        }
        while(loop != "quit"){
                System.out.println("\nPlease select a traveral path:");
                System.out.println("(Enter the choice in parenthesis EXACTLY)\n");
                System.out.println("(inorder)Invokes InOrder Traversal");
                System.out.println("(postorder)Invokes PostOrder Traversal");
                System.out.println("(preorder)Invokes PreOrder Traversal");
                System.out.println("(quit)Quits the Program");
                System.out.println("Your choice: ");

                try{
                    loop = br.readLine();
                } catch (IOException ioe) {
                    System.out.println("IO error trying to read your choice!\n");
                    System.exit(1);
                }

                System.out.println("\n");

                if(loop == "inorder"){
                    InOrder.main();     //the calls for executing the statements
                } else if(loop == "postorder"){
                    PostOrder.main();   // ''   
                } else if(loop == "preorder"){
                    PreOrder.main();    // ''
                } else if (loop == "quit");
        }

    }

}

类声明:

package binTreeImprovedTwo;

import binTreeImprovedTwo.BinTree.Node;

/**
 * Class BinTree.
 */
public class BinTree {

    /** The root. */
    public Node root = new Node(1111);

    /**
     * The Class Node.
     */
    static class Node{

        /** The left. */
        Node left;

        /** The right. */
        Node right;

        /** The data. */
        int data;

        /**
         * Instantiates a new node.
         *
         * @param newData the new data
         */
        public Node(int newData){
            left = null;
            right = null;
            this.data = newData;
        }
    }

    /**
     * Bin tree.
     */
    public void BinTree(){
    }

    /**
     * Insert node.
     *
     * @param root is the root
     * @param value is the value to be inserted
     */
    public void insertNode(Node root, int value){
        if(root.data == 1111){
            root.data = value;
        } else if(value < root.data){
            if(root.left != null){
                insertNode(root.left, value);
            } else {
                root.left = new Node(value);
                }
        } else if(value > root.data){
            if(root.right != null){
                insertNode(root.right, value);
            } else {
                root.right = new Node(value);
            }
        }
    }

    /**
     * Super Class traverse.
     *
     */
    public class Traverse{

        public void left(Node root){
            if(root != null){
                left(root.left);
            }
        }   //end left function

        public void print(){
            System.out.println(" " + root.data);
        }   //end of print function

        public void right(Node root){
            if(root != null){
                right(root.right);
            }
        }   //end right function
    }   //end of class traverse

    public class InOrder extends Traverse{
        public void main(String args[]){
            super.left(root);
            super.print();
            super.right(root);
        }       
    }   //end of InOrder class

    public class PostOrder extends Traverse{
        public void main(String args[]){
            super.left(root);
            super.right(root);
            super.print();
        }
    }   //end of PostOrder class

    public class PreOrder extends Traverse{
        public void main(String args[]){
            super.print();
            super.left(root);
            super.right(root);
        }
    }   //end of PreOrder class
}
4

2 回答 2

1

看起来您将类定义与应用程序中创建的实际对象混合在一起。特别是,如果你想调用一个 Node 的方法,你需要在你的代码中找到一个 Node 对象。查看您的代码,我发现您可能想在名为 root 的 Node 实例上调用 Node 方法。

您所做的只是首先引用根节点,然后调用方法:

tree.root.<method>

您还没有在 Node 上定义任何公共方法,所以我不知道您要使用哪个方法名称。


我认为您需要像这样更改 Traverse API:

对于超类:

    public abstract static class Traverse {
        public abstract void run(Node node);

        protected void print(Node node) {
            System.out.println(" " + node.data);
        }
    }

对于一个实施。我将其称为 AnOrder 并由您决定您想要哪个订单。

    public static class AnOrder extends Traverse {
        public void run(Node node) {
            run(node.left);
            run(node.right);
            print(node);
        }
    }

这就是您在代码中调用它的方式。创建时:

Traverse traverse = new AnOrder() // or any other XXXOrder based on user input

当你使用它时:

traverse.run(tree.root);
于 2013-02-24T03:27:59.053 回答
1

你问错问题了。

我通常不这样做——我主要赞成回答某人提出的问题,但在我认为我比他们更了解这个问题的情况下,我会例外。

OO 编程背后的想法是使用类来表示程序中的“对象”;您可能没有这样做的提示是您的某些类的名称——inorder、postorder 等。这些是操作,而不是对象。你可以用这种方式组织你的代码,但是你可能会发现有些方法更容易,而且肯定会更符合大多数其他人的做法。

快速猜测一下,您的“BinTree”类可以使用这些名称对其进行操作;BinTree 类包含在您的编程问题中表示对象(二叉树)的代码。您可以声明该类型的变量(BinTree tree = new BinTree(); 或其他),用其节点填充它,然后对其调用操作(tree.inOrder())。

static void main(String[] args) 不是做你正在做的事情的正确方法。它是一个特殊的方法名;将它放在一个类中可以使该类作为 java 程序调用,参数来自命令行或等效项。

所以我建议你再试一次——在驱动类中使用static void main();让它创建一个 BinTree 对象,用节点填充对象,然后在该类上调用操作。

于 2013-02-24T03:29:02.200 回答