【问题标题】:Java Scanner while loopJava 扫描器 while 循环
【发布时间】:2015-03-30 00:03:06
【问题描述】:

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

例子:

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

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

【问题讨论】:

  • 我使用的ScannershasNext()方法一直是在读取文件的时候;也许你需要一个哨兵控制的循环。循环直到用户输入 -999 或不应该是输入数据一部分的 int

标签: java arraylist while-loop java.util.scanner system.in


【解决方案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;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));

编辑评论。

例如,您可以使用 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();
        ...
    }
}

【讨论】:

  • 哦,天哪,总是小事,改成双语完全修复了输出:)谢谢
  • 如何使用下一个空白行结束流?
【解决方案2】:

由于 Radiodef 已经回答了您的实际问题(" 而不是 '),这里有一些我认为可能对您有所帮助的建议(这更多的是评论而不是答案,但对于实际评论):

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

Scanners useDelimiter 调用返回 Scanner,因此它可以被链接起来,作为 Scanner 初始化的一部分。 IE。你可以写:

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,当从终端输入读取时,它也会在第一个空白行结束输入。

【讨论】:

  • "使用 hasNextInt [...] 只需键入除数字以外的任何内容即可轻松结束输入" 这不起作用,实际上,扫描仪只会跳过非整数并尝试向前扫描(它会再次提示)而不是返回 false。
  • 你说得对,谢谢,我把 \\D 和他的分隔符搞混了。使用 hasNextInt 您必须以分隔符结束输入。更新以更正此问题。
猜你喜欢
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 2019-11-28
相关资源
最近更新 更多