让diffuculty正确地从Java中的控制台读取输入

时间:2016-03-29 02:44:52

标签: java input

我有问题从控制台读取输入,如下所述:

输入:
    第一行输入包括测试用例的数量。 T测试用例的描述如下:
    每个测试用例的第一行包含数组的大小,第二行包含数组的元素,第三行包含差异k。

Example:
Input:
2
5 
1 5 4 1 2
0
3 
1 5 3
2

这是我的代码及其输出错误:

    Scanner input = new Scanner(System.in);
    int T;
    T = input.nextInt();
    int[] k_holder = new int[T];
    int[] n_holder = new int[T];
    int[][] array  = new int[T][10000];

    for (int i=0; i<T; i++) { // length of test
        n_holder[i] = input.nextInt();
        String tmp[] = input.next().split(" ");

        for (int j=0;j<tmp.length; j++) {
            array[i][j] = Integer.parseInt(tmp[j]);
        }

        int K = input.nextInt(); // difference 
        k_holder[i] = K;
    }
            System.out.println("===============");

    for (int i=0; i<T; i++) {
        System.out.println(n_holder[i]);

        for (int j=0; j<n_holder[i]; j++) {
            System.out.print(array[i][j] + " ");
        }
        System.out.print("\n" + k_holder[i]);
    }


Output:
2
5
1 5 4 1 2
===============
5
1 0 0 0 0 
54
1 0 0 0 
2

一旦我在array_line之后输入enter(在上面的例子中array_line是1 5 4 1 2),我得到了奇怪的输出

2 个答案:

答案 0 :(得分:2)

因为您没有提供预期的结果。很难说你到底要做什么,以下是我的建议。

  1. 在所有input.nextLine();语句后添加nextInt()nextInt()无法使用换行符(\ n),因此需要input.nextLine()捕获它,或者结果会搞砸。

  2. 使用String tmp[] = input.nextLine().split(" ");来解析空格分隔线,next()仅处理第一个令牌。

    import java.io.BufferedWriter;     import java.io.FileWriter;     import java.io.IOException;     import java.time.LocalDateTime;     import java.util.Scanner;

    public class Main{
        public static void main(String args[]) throws IOException{
            new Main().go();
        }
    
        public void go() throws IOException{
            Scanner input = new Scanner(System.in);
            int T;
            T = input.nextInt();
            input.nextLine();
            System.out.println("T is " + T);
            int[] k_holder = new int[T];
            int[] n_holder = new int[T];
            int[][] array  = new int[T][10000];
    
            for (int i=0; i<T; i++) { // length of array
                n_holder[i] = input.nextInt();
                input.nextLine();
                System.out.println("n_holder[" +i + "] is " + n_holder[i]);
    
                String tmp[] = input.nextLine().split(" ");
               for(String e : tmp){
                    System.out.print(" " + e);
                }
    
                for (int j=0;j<tmp.length; j++) {
                    array[i][j] = Integer.parseInt(tmp[j]);
                }
    
                int K = input.nextInt(); // difference
                input.nextLine();
                k_holder[i] = K;
            }
            System.out.println("===============");
    
            for (int i=0; i<T; i++) {
                System.out.println(n_holder[i]);
    
                for (int j=0; j<n_holder[i]; j++) {
                    System.out.print(array[i][j] + " ");
                }
                System.out.print("\n" + k_holder[i]);
            }
        }
    }
    
  3. 我的测试:

    2
    T is 2
    5
    n_holder[0] is 5
    1 5 4 1 3
     1 5 4 1 3
    0
    3
    n_holder[1] is 3
    1 5 3
     1 5 3
    2
    ===============
    5
    1 5 4 1 3 
    03
    1 5 3 
    2
    

答案 1 :(得分:1)

你实际上并没有在这里问一个问题,但是如果你想知道为什么你的阵列输出是1 0 0 0 0而不是1 5 4 1 2,原因是因为你打电话

String tmp[] = input.next().split(" ");

而不是

String tmp[] = input.nextLine().split(" ");

请注意,默认情况下,扫描程序是以空格分隔的。这意味着input.next()只抓取第一个标记,直到它到达空格。因此,如果你输入&#34; 1 5 4 1 2&#34;,它只抓住1,然后用其余的输入做一些时髦的扫描仪啜饮。我相信它甚至会抓住剩下的那条线作为扫描仪的下一个输入!所以你的input.nextInt()以某种方式在54中循环,然后循环回来,input.next()抓住1,最后input.nextInt()抓住2(因此有趣的输出,并观察我们可以看到1 5 4 1 2从侧面跑下来。)

为什么它决定nextInt()是54而不是5,但我不清楚。