扫描仪nextLine,卡在while循环中或在奇数时间退出

时间:2015-08-28 23:06:37

标签: java java.util.scanner

我昨晚开始处理CodeAbbey问题,他们提到使用stdIn,因为一些输入数据很长,所以复制/粘贴比手工更容易。我之前从未使用过扫描仪,所以它看起来很容易。我得到它的单线输入工作然后我遇到输入的问题:

867955 303061
977729 180367
844485 843725
393481 604154
399571 278744
723807 596408
142116 475355 

我认为nextLine会读每一对,xxxx yyyyy。如果nextLine不为空,我将代码放在while循环中。它运行,但我得到奇怪的输出,并且只有在我返回几次之后。

package com.secryption;

import java.util.Scanner;


public class Main {

    public static void main(String[] args) {

        System.out.println("Input: ");
        Scanner scanner = new Scanner(System.in);
        String input = "";


        while(!(scanner.nextLine().isEmpty())) {
            input = input + scanner.nextLine();
        }
        String[] resultSet = input.split("\\s+");

        for(String s : resultSet) {
            System.out.println(s);
        }


    }

}

我认为在将scanner.nextLine()添加到输入后可能需要一些东西。我尝试了一个空间,但没有帮助。我尝试了换行,但没有让它变得更好。

这个“应该”将所有数字放在一个数组中,没什么特别的。扫描仪我错过了什么?

编辑:好的,所以@Luiggi门多萨是对的。我找到了这个How to terminate Scanner when input is complete?帖子。所以基本上它起作用了,我只是期望它能做点什么。

2 个答案:

答案 0 :(得分:1)

问题在于:

while(!(scanner.nextLine().isEmpty())) {
    input = input + scanner.nextLine();
}

Scanner#nextLine读取该行并继续阅读。你正在阅读两行而不是存储第一行读取的结果,只是读取和存储第二行的结果。

只需将上面的代码更改为:

StringBuilder sb = new StringBuilder();
while(scanner.hasNextLine()) {
    sb.append(scanner.nextLine()).append(" ");
}

答案 1 :(得分:0)

hasNext()是一个文件结束指示符,它通过组合Mac上的键控制d来终止,而Windows上的控件z按下回来将不会发送正确的消息 到JVM