Java Pass对象的方法

时间:2013-03-07 07:49:12

标签: java binary-search-tree splay-tree

我有一个程序,允许用户在二叉搜索树,一个splay树和一个红黑树之间进行选择。我为二叉搜索树编写了类,现在我正在使用splay树,但我已经意识到我与用户交互的方法只适用于二叉搜索树。我进行了设置,以便创建一个用户选择的树的实例,但在我的代码中,我只使用在用户选择二叉搜索树时创建的变量。我的问题是我怎么能这样做,以便我只创建一个用户选择的树的实例,我怎么能只使用一个变量,这样当我插入项目或在树上工作时,我不必添加更多的条件语句对于不同的树木?

这就是我现在所拥有的

import java.util.Scanner;
import java.lang.Math.*;
public class Driver1
{ 


public static void main(String[] args)
{
    //local variables
    String treeChoice = null;
    String choice = null;
    String choice2 = null;
    String command = null;
    int insertAmount = -1;
    String pattern;
    int height = -1;
    int i = -1;
    //BST<Integer> myTree = null;
    //ST<Integer> mySTTree = null;

    int num = 0;


    //Scanners to take user input
    Scanner input = new Scanner(System.in);
    Scanner inputt = new Scanner(System.in);
    System.out.println("Which tree would you like to test (BST, ST, RBT)? ");
    treeChoice = input.nextLine();

    //Based on user input either a BST, Splay Tree, or RBT will be initialized.
    if("BST".equalsIgnoreCase(treeChoice))
    {
        BST<Integer> myTree = new BST<Integer>();
    }
    else if("ST".equalsIgnoreCase(treeChoice))
    {
        //System.out.println("Splay Tree not ready yet");
        ST<Integer> mySTTree = new ST<Integer>();
    }
    else if("RBT".equalsIgnoreCase(treeChoice))
    {
        System.out.println("RBT not ready yet");
        //RBT<Integer> myTree = new RBT<Integer>();
    }
    else
    {
        System.out.println("Invalid Entry");
    }

    //Ask user how many items to input
    System.out.println("How many items would you like to insert? ");
    insertAmount = input.nextInt();

    //ask user if the items will be random or sorted
    System.out.println("Pattern (random or sorted): ");
    choice2 = inputt.nextLine();

    //If random, create random numbers
    if("random".equalsIgnoreCase(choice2))
    {
        for(i = 1; i <= insertAmount; i++)
        {
            myTree.insert((int)(Math.random()*1000000)+i);
        }
    }
    //else fill the tree with numbers in order from 1 to the user limit
    else if("sorted".equalsIgnoreCase(choice2))
    {
        for(i = 1; i <= insertAmount; i++)
        {
            myTree.insert(i);
        }
    }
    //Keep asking users input on what to do to the tree until user says quit
    while(command != "quit")
    {
        System.out.println(
        "Next command (insert X, delete X, find X, height, quit)?");
        command = inputt.nextLine();


        if (command.startsWith("insert")) 
        {
         num = Integer.parseInt(command.replaceAll("\\D", ""));
         boolean result = myTree.insert(num);
         if(result == false)
         {
            System.out.println("Item already present.");
         }

        }
         else if(command.startsWith("delete"))
         {
            num = Integer.parseInt(command.replaceAll("\\D", ""));
            boolean result = myTree.delete(num);
        }
        else if(command.startsWith("find"))
        {
            num = Integer.parseInt(command.replaceAll("\\D", ""));
            boolean result = myTree.find(num);
            if(result == true)
            {
                System.out.println("Item present.");
            }
            else
            {
                System.out.println("Item not present.");
            }

        }
        else if(command.startsWith("height"))
        {
            System.out.println("Current height of tree " + myTree.height());
        }
        else if(command.startsWith("quit"))
        {
            break;
        }
        System.out.println();
    }   
}//Close main method

正如您所看到的,我只填写myTree,如果用户选择了bst,则会创建树。在while循环中,我只在myTree上工作。

我如何使这更通用或我的另一个想法是获取用户输入,然后创建该树的实例,然后将实例传递给一个单独的方法,以便我仍然可以只使用myTree,因为它将引用传递给该方法的实例但我不确定如何将实例传递给另一个方法。这种方式似乎是最好的,但我不确定

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

你的树应该扩展一个公共基类,或者更好的是一个工具通用接口,比如Tree,它指定了在所有树上使用的方法(findinsertdelete)。然后,您应该只有一个变量Tree myTree,您可以为其分配用户选择的类型的实际实例。

但是,您确定上述代码有效吗?如果你这样做

if("BST".equalsIgnoreCase(treeChoice))
{
    BST<Integer> myTree = new BST<Integer>();
}

然后变量myTree}之后将不可用,因为声明它的代码块在那里结束。您可以在一个点声明变量并稍后为其赋值,如下所示:

Tree<Integer> myTree;
if("BST".equalsIgnoreCase(treeChoice)) {
    myTree = new BinarySearchTree<Integer>();
} else if("ST".equalsIgnoreCase(treeChoice)) {
    myTree = new SplayTree<Integer>();
} else if("RBT".equalsIgnoreCase(treeChoice)) {
    myTree = new RedBlackTree<Integer>();
} else {
    throw new IllegalArgumentException(treeChoice + " is not a valid input");
}

我非常建议你给你的课程真实姓名,使他们代表什么,而不仅仅是两三个字母组合。请注意,如果您不在最后一个else分支中抛出异常,编译器稍后会抱怨“变量myTree可能尚未初始化”。

或者,您可以将树创建if-else-statements之后的所有代码放入方法中,比如说<T> void testTree(Tree<T> myTree)并直接在评估用户输入的位置调用此方法,例如: if("BST".equalsIgnoreCase(treeChoice)) testTree(new BinarySearchTree<Integer>());,但在某些情况下,您仍然希望将其分配给变量。