使用 split() 并检查第二个元素

Using split() and checking for a 2nd element

我有二叉搜索树的代码,可以接受用户输入,例如 insert 3 并且它将在 3 上调用插入函数。当我尝试调用一个不需要参数的函数时,比如我的遍历函数,它将给出一个越界错误,除非用户输入是 traverse 0 我想要仅使用 traverse 来调用它,这是我的代码:

 public static void main(String[] args) 
{
    int quit = 0;
    BinarySearchTree bst = new BinarySearchTree();
    Scanner in = new Scanner(System.in);

    //Accept user input and call funtions
    while(quit != 1)
    {
        System.out.print("\nEnter the instructions to perform (type quit when done):");
        String input = in.nextLine();
        String[] instruction = input.split(" ");
        String function = instruction[0].toLowerCase();
        String parameter = instruction[1];
        //What to do with user input
        if(function.equals("insert"))// for insert
        {
            int key = Integer.parseInt(parameter);
            bst.insert(key);
            System.out.println(parameter + " was inserted successfully!");
        }
        else if(function.equals("delete"))// for delete
        {
            int key = Integer.parseInt(parameter);
            if(bst.delete(key) == true)
                System.out.println(parameter + " was deleted successfully!");
            else
                System.out.println(parameter + " does not exist.");
            bst.delete(key);
        }
        else if(function.equals("search"))// for search
        {
            int key = Integer.parseInt(parameter);
            if(bst.search(key) == true)
                System.out.println(parameter + " was found!");
            else
                System.out.println(parameter + " not found.");
            bst.search(key);
        }
        else if(function.equals("traverse"))// for traverse
        {
            bst.traverse(BinarySearchTree.root);
        }
    }

}//end main

当您尝试将 instruction[1] 分配给 parameter 时出现问题。如果输入字符串中没有 space 字符,那么 split 方法将 return 一个长度为 1 的数组,当您尝试访问第二个元素时,您将得到一个超出范围的异常.

解决方法是:

if (input.equals("traverse")) {
    ...
} else {
    String[] instructions = input.split(" ");
    assert instruction.length == 2;
    String function = instruction[0].toLowerCase();
    int key = Integer.parseInt(instruction[1]);
    ...
}

有更好的命令建模方法。理想情况下,您会使用 command pattern 而不是 if 语句。但是如果你不想遇到那个麻烦,你至少应该考虑使用模式来使解析更健壮。

Pattern commandPattern = Pattern.compile("(traverse|search|delete|insert) *(\d*)");
Matcher matcher = commandPattern.match(in.nextLine());
if (!matcher.matches()) {
    System.out.println("Illegal command. Try again.");
    matcher = commandPattern.match(in.nextLine());
}
switch (matcher.group(1).toLowerCase()) {
    case "traverse":
        bst.traverse(root);
        break;
    case "delete":
        int deleteKey = Integer.parseInt(matcher.group(2));
        if (bst.delete(deleteKey)) {
            ...