Java Scanner .nextInt() 跳过输入

Posted

技术标签:

【中文标题】Java Scanner .nextInt() 跳过输入【英文标题】:Java Scanner .nextInt() skipping inputs 【发布时间】:2019-11-16 12:32:01 【问题描述】:

这里是Java新手,尝试扫描以下表单中的输入:

3

3 3 101 000 101

1 2 11

5 5 10001 00000 00000 00000 10001

(第一个数字是测试用例的数量,然后是行和列,0s和1s是世界的状态,等等。基本上和任何典型的BFS问题一样)

下面是我尝试从控制台获取输入的 Java 代码的一部分。 cmets 是我在调试时在 watch 部分看到的值:

public static void main(String[] args) 

    Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
    int t = in.nextInt(); // t: 3, in.nextInt(): 3 as expected

    for (int i = 1; i <= t; i++)  // i: 1, t: 3, in.nextInt(): 3 (not sure which "3")
        int row = in.nextInt();
        // after this line in.nextInt(): 101 and row: 0 which are all WEIRD
        int column = in.nextInt();
        // now here it's in.nextInt(): 2 and column: 2

        int world[][] = new int[row][column];

        // in.nextInt(): 11 now and as we see it changed its value when I didn't even call it

        TreeMap<Integer, ArrayList<int[]>> distancesRandAcc = new TreeMap<Integer, ArrayList<int[]>>();
        distancesRandAcc.put(0, new ArrayList<int[]>());

        for (int j = 0; j < row; j++) 
            int temp = in.nextInt();
            char[] s = Integer.toString(temp).toCharArray();
            for (int k = 0; k < column; k++)
                world[j][k] = Character.getNumericValue(s[k]);
            
        
        int result = calculateDeliveryTime(world, row, column, distancesRandAcc);
        System.out.println("Case #" + i + ": " + result);
    

这做了一些超出“常识”的奇怪事情。在将所有输入放入 IntelliJ 控制台后,我正在逐行调试,似乎 in.nextInt() 无法停止在随机行中获取随机数量的令牌无论我是否调用它。

当我在逐行调试时尝试逐行输入输入时,似乎对 .nextInt 的一次调用要求两个 int 值。 (我输入了一个数字并输入,但它仍然在等待另一个输入,同时停留在 .nextInt() 只调用一次的同一行)

此时,我感觉我的调试过程是错误的,或者至少是一些外部问题,而不是代码本身。我可能错了,因为我仍然认为自己是新手......

请有经验的人教我如何解决这个问题?我发现一些问题与 .nextLine() 和 .nextInt() 有类似的问题,但不完全是这样。如果它真的是重复的,我提前道歉......

(如果需要我会添加更多信息)

【问题讨论】:

【参考方案1】:

您正在调用nextInt(),因此输入000 被解析为数字0,因此int 返回值是0。因此Integer.toString() 将返回字符串"0"。你为什么对此感到惊讶?

由于您实际上并不关心作为数字输入的内容,因此只需使用next

for (int j = 0; j < row; j++) 
    String s = in.next();
    for (int k = 0; k < column; k++) 
        world[j][k] = Character.getNumericValue(s.charAt(k));
    


更新

这是读取输入的问题代码的唯一问题。 calculateDeliveryTime是否有问题未知。

请参阅IDEONE 以获取证据。 calculateDeliveryTime 方法只是简单的打印二维数组,所以可以看出输入已经处理好了。

【讨论】:

感谢您提供的好选择。我已经按照您的建议更改了我的代码,它看起来肯定更好并且更有意义。但是,我的问题主要不是关于那部分。问题出现在前几行。 @JTC “问题出现在前几行”。不,不是。我运行了代码,当应用这里的更改时它运行良好。 哦,好吧!我又试了几次,又编辑了几行后整理出来。 + 我认为主要是我的调试技巧有问题。非常感谢!

以上是关于Java Scanner .nextInt() 跳过输入的主要内容,如果未能解决你的问题,请参考以下文章

java 利用Scanner类的nextInt()方法从控制台读入一个整数

Java中Scanner类在nextInt()后无法输入nextLine()的问题

java Scanner类的nextInt()方法在循环中无法停止的问题

我在Scanner.nextInt()之后输入一个Scanner.nextLine()来使用新行,但它不能正常工作[重复]

HDU 2075: A|B? (in Java)

Scanner和bufferreader读取控制台字符的区别