使用 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)) {
...
我有二叉搜索树的代码,可以接受用户输入,例如
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)) {
...