我正在尝试接受一个字符串输入,该输入由多行数字组成,用','和';'分隔
示例:
1,2;3,4;5,6;
9,8;7,6;
0,1;
;
代码:
ArrayList<Integer> alist = new ArrayList<>();
String delims = ";|\\,";
int i = 0;
Scanner input = new Scanner(System.in);
input.useDelimiter(delims);
while (input.hasNext()) {
alist.add(i, input.nextInt());
System.out.print(i + ' ');
System.out.print(alist.get(i) + '\n');
i++;
}
System.out.print('x');
当我在日食中运行时:
1,2;3,4;5,6; ( <= what i typed in console)
321133123413351436153716 ( <= output)
我希望更像是:
0 1
1 2
2 3
3 4
4 5
5 6
x
为什么我会得到这种输出?
答案 0 :(得分:1)
一个问题是System.in
基本上是一个无限流:hasNext
将始终返回true,除非用户输入一个关闭它的特殊命令。
因此,您需要让用户输入一些信息,告诉您已完成。例如:
while(input.hasNext()) {
System.out.print("Enter an integer or 'end' to finish: ");
String next = input.next();
if("end".equalsIgnoreCase(next)) {
break;
}
int theInt = Integer.parseInt(next);
...
对于您的程序,您可能会尝试使用您检查的特殊字符1,2;3,4;5,6;end
或1,2;3,4;5,6;#
来解析输入。
在这些方面:
System.out.print(i + ' ');
System.out.print(alist.get(i) + '\n');
看起来您正在尝试执行String
连接,但由于char
是数字类型,因此它会执行添加。这就是为什么你得到疯狂的输出。因此,您需要使用String
代替char
:
System.out.print(i + " ");
System.out.print(alist.get(i) + "\n");
或者只是:
System.out.println(i + " " + alist.get(i));
编辑评论。
例如,您可以使用nextLine
使用默认分隔符从Scanner
提取输入,然后创建第二个Scanner
来扫描该行:
Scanner sysIn = new Scanner(System.in);
while(sysIn.hasNextLine()) {
String nextLine = sysIn.nextLine();
if(nextLine.isEmpty()) {
break;
}
Scanner lineIn = new Scanner(nextLine);
lineIn.useDelimiter(";|\\,");
while(lineIn.hasNextInt()) {
int nextInt = lineIn.nextInt();
...
}
}
答案 1 :(得分:0)
由于Radiodef已经回答了您的实际问题("
而不是'
),这里有一些我认为可能对您有帮助的指针(这更多的是评论而不是答案,但是实际评论太长了):
使用扫描程序时,请尝试将hasNextX
函数调用与nextX
调用匹配。即在您的情况下,请使用hasNextInt
和nextInt
。这样就不太可能在意外输入时获得异常,同时只需键入另一个分隔符便可轻松结束输入。
扫描程序useDelimiter
调用返回扫描程序,因此可以将其链接,作为扫描程序初始化的一部分。即你可以写:
Scanner input = new Scanner(System.in).useDelimiter(";|\\,");
当您添加到ArrayList的末尾时,您不需要(通常不应该)指定索引。
int i = 0
,i++
是for循环的教科书示例。仅仅因为您的测试语句不涉及i
并不意味着您不应该使用for循环。
您的代码,上述要点如下:
ArrayList<Integer> alist = new ArrayList<>();
Scanner input = new Scanner(System.in).useDelimiter(";|\\,");
for (int i = 0; input.hasNextInt(); i++) {
alist.add(input.nextInt());
System.out.println(i + " " + alist.get(i));
}
System.out.println('x');
编辑:只需要提一下我最喜欢的Scanner分隔符,因为它非常合适:
Scanner input = new Scanner(System.in).useDelimiter("\\D");
这将使扫描仪仅仅是数字,分裂任何不是数字的东西。结合hasNextInt
,当从终端输入读取时,它也会在第一个空白行结束输入。