我正在尝试按以下格式拆分字符串:AND 1 0
。
下面的逻辑方法使用.nextLine()
接受字符串读取。
虽然我能够使用split方法和\\s+
正则表达式将String拆分为数组,但每当我尝试访问数组的第二个值时,我都会遇到ArrayOutOfBound错误。
数组的第二个和第三个索引应包含值' 1'和' 2'分别 - 为什么会产生错误?
代码:
import java.util.*;
public class HelloWorld {
public static int logic(String operator){
String[] splitted = operator.split("\\s+");
int val = 0;
System.out.println(splitted.length); //Returns 3
System.out.println(operator); //Returns AND 1 0
System.out.println(splitted[0]); //Returns AND
System.out.println(splitted[2]); //ERROR
return val;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int val = sc.nextInt(); //Error lies here, should be parsed as String.
if(val == 1){
int no_times = sc.nextInt();
for(int i = 0 ; i < no_times; i++){
System.out.println(logic(sc.nextLine()));
}
sc.close();
}
}
}
输入:
OR 1 1
AND 0 1
AND 1 0
OR 0 0
AND 0 0
OR 1 0
OR 0 1
OR 0 1
OR 1 1
OR 1 0
答案 0 :(得分:1)
我已尝试运行您的代码,并且无错误地生成正确的输出。
然而,当我尝试用一些奇怪的字符替换“AND”,“1”,“0”之间的空格(可能在中文称为“SBC case”空格时,那些字符无法被\\ s +识别),它重现你的错误。所以我建议你检查“AND”,“1”,“0”之间是否有英文空格字符(可以被\\ s +识别)。
答案 1 :(得分:0)
试试这个。你得到那个错误,因为分割的长度小于你想要打印的长度。
第一种方法
public static int logic(String operator){
String[] splitted = operator.split("\\s+");
int val = 0;
System.out.println(operator); //Prints "AND 1 0"
System.out.println("splitted length :: "+splitted.length());
for (String str:splitted) {
System.out.println(str); //Prints "AND"
}
// System.out.println(splitted[1]); //ERROR
return val;
}
第二种方法
public static int logic(String operator){
String[] splitted = operator.split("\\s+");
int val = 0;
System.out.println(operator); //Prints "AND 1 0"
System.out.println("splitted length :: "+splitted.length());
for (int i = 0; i<splitted.length();i++) {
System.out.println(splitted[i]); //Prints "AND"
}
// System.out.println(splitted[1]); //ERROR
return val;
}
答案 2 :(得分:0)
我无法看到错误,您提供的代码段应该有效。虽然您可以使用以下内容来避免异常:
public static int logic(String operator){
String[] splitted = operator.split("\\s+");
int val = 0;
System.out.println(operator); //Prints "AND 1 0"
for(String split : splitted) {
System.out.println(split);
}
return val;
}
答案 3 :(得分:0)
你真的应该让你的代码更清晰,特别是在寻求帮助时。至于你的问题,这是Scanner is skipping nextLine() after using next() or nextFoo()?
的副本 Scanner#nextInt
在输入后没有使用\ n,因此nextLine()只是接收\n
。
固定代码:
public static void main(String[] args) {
System.out.print("Type 1 to continue: ");
Scanner sc = new Scanner(System.in);
int val = sc.nextInt();
if(val == 1){
System.out.print("\nHow many tests do you want to run? ");
int no_times = sc.nextInt();
sc.nextLine();
for(int i = 0 ; i < no_times; i++){
System.out.print("\nLogic: ");
System.out.println(logic(sc.nextLine()));
}
sc.close();
}
}
答案 4 :(得分:0)
nextLine
方法正在从当前光标位置读取值直到行尾,并且它还包括分隔符。因此,当我们读取第一行输入时,它会占用这里的分隔符。例如,如果我们的第一个像1 1 OR 1 1
然后第一个nextInt返回1 然后第二个nextInt返回1 然后nextLine返回&#39;或1 1&#39;它的长度是4.我想,你的第一个输入是错的可能是你在那里遗漏了一些东西。 一个简单的解决方案就是更改代码的以下行。
String[] splitted = operator.split("\\s+");
到
String[] splitted = operator.trim().split("\\s+");
在拆分之前修剪。这样就删除了尾随空格。它可以解决你的问题。
答案 5 :(得分:-1)
完整输入首先包含两个整数。这两个整数由nextLine()
而不是"Make sure that all repositories are available from your system and verify your setup by running manually:
. sudo apt-get update
"
解析,因此逻辑方法的给定参数没有接受完整的字符串 - 因此拆分失败。