【问题标题】:Java Scanner .nextInt() skipping inputsJava Scanner .nextInt() 跳过输入
【发布时间】: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() 有类似的问题,但不完全是这样。如果它真的是重复的,我提前道歉......

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

【问题讨论】:

    标签: java java.util.scanner


    【解决方案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 “问题出现在前几行”。不,不是。我运行了代码,当应用这里的更改时它运行良好。
    • 哦,好吧!我又试了几次,又编辑了几行后整理出来。 + 我认为主要是我的调试技巧有问题。非常感谢!
    猜你喜欢
    • 2019-12-27
    • 2013-04-04
    • 1970-01-01
    • 2013-03-09
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多