1

我正在尝试接受一个字符串输入,该输入由多行数字组成,由“,”和“;”分隔 .

例子:

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');

当我在 Eclipse 中运行它时:

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

为什么我会得到这种输出?

4

2 回答 2

2

一个问题是这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;end1,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));

编辑评论。

例如,您可以使用带有默认分隔符的nextLinefrom a提取输入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();
        ...
    }
}
于 2015-03-30T00:45:03.203 回答
0

由于 Radiodef 已经回答了您的实际问题("而不是'),因此我认为以下几点可能对您有所帮助(这更像是评论而不是答案,但对于实际评论来说太长了):

使用 Scanner 时,请尝试将hasNextX函数调用与nextX调用匹配。即在您的情况下,使用hasNextIntand nextInt。这使得您在意外输入时出现异常的可能性大大降低,同时还可以通过键入另一个分隔符来轻松结束输入。

ScannersuseDelimiter调用返回 Scanner,因此它可以被链接,作为 Scanner 初始化的一部分。即你可以写:

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 input = new Scanner(System.in).useDelimiter("\\D");

这将使扫描仪只处理数字,拆分任何不是数字的东西。当从终端输入读取时,结合hasNextInt它也会在第一个空白行结束输入。

于 2015-03-30T01:11:13.097 回答