1

私はJavaでの割り当てに取り組んでおり、かなり独特な問題に直面しています。基本的に、パッケージには2つのファイルがあります。テスト用のドライバーファイルと、実際のクラスファイルです。ドライバ/テストファイルから、2つのクラスの深さのステートメントをどのように呼び出しまたは実行するのか疑問に思っていますか?(つまり、パブリッククラスHelloがあり、このクラス内にパブリッククラスGoodbyeと呼ばれる別のクラスが宣言されています。Goodbye内でステートメントを実行したいと思います。)

以下は、クラス宣言とドライバーファイルの両方のコードです。私が実行しようとしている関数は、InOrder / PostOrder/PreOrderクラスです。「publicvoidmain(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>

ノードでパブリックメソッドを定義していないため、使用するメソッド名がわかりません。


TraverseAPIを次のように変更する必要があると思います。

スーパークラスの場合:

    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

あなたは間違った質問をしている。

私は通常これをしません-私は誰かが尋ねる質問に答えることに大抵賛成です、しかし私が彼らよりも質問をよく知っていると思う場合には例外を作ります。

オブジェクト指向プログラミングの背後にある考え方は、クラスを使用してプログラム内の「オブジェクト」を表すことです。これを行っていない可能性があるというヒントは、一部のクラスの名前(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 に答える