Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中从控制台正确读取输入时有困难_Java_Input - Fatal编程技术网

在Java中从控制台正确读取输入时有困难

在Java中从控制台正确读取输入时有困难,java,input,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

我无法从控制台读取输入,如下所述:

输入:
输入的第一行由测试用例的数量组成。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
扫描仪输入=新扫描仪(System.in);
int T;
T=input.nextInt();
int[]k_holder=新的int[T];
int[]n_holder=新的int[T];
int[][]数组=新的int[T][10000];

对于(int i=0;i您实际上没有在这里提问,但是如果您想知道为什么数组输出是1 0 0 0 0而不是1 5 4 1 2,原因是您调用了

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

String tmp[] = input.nextLine().split(" ");
请注意,默认情况下,扫描程序是以空格分隔的。这意味着
input.next()
只会获取第一个标记,直到它到达空格。因此,如果您的输入为“1 5 4 1 2”,它只是抓取1,然后用其余的输入做一些时髦的扫描。我相信它甚至会抓取该行的其余部分作为扫描仪的下一个输入!所以你的
input.nextInt()
以某种方式在54中缠绕,然后循环回,
input.next()
抓取1,最后的
input.nextInt()
抓取2(因此,我们可以看到有趣的输出,我们可以看到1 5 4 1 2沿着侧面运行)


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

您实际上没有在这里提出问题,但是如果您想知道为什么数组输出是1 0 0 0 0而不是1 5 4 1 2,原因是您调用了

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

String tmp[] = input.nextLine().split(" ");
请注意,默认情况下,扫描程序是以空格分隔的。这意味着
input.next()
只会获取第一个标记,直到它到达空格。因此,如果您的输入为“1 5 4 1 2”,它只是抓取1,然后用其余的输入做一些时髦的扫描。我相信它甚至会抓取该行的其余部分作为扫描仪的下一个输入!所以你的
input.nextInt()
以某种方式在54中缠绕,然后循环回,
input.next()
抓取1,最后的
input.nextInt()
抓取2(因此,我们可以看到有趣的输出,我们可以看到1 5 4 1 2沿着侧面运行)


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

由于您没有提供预期结果。很难说您到底要做什么,下面是我的建议

  • 添加
    input.nextLine();
    在所有
    nextLine()
    语句之后,
    nextInt()
    不能使用换行符(\n),因此它需要
    input.nextLine()
    捕获它,否则结果会出错

  • 使用
    String tmp[]=input.nextLine().split(“”;
    来解析空格分隔的行,
    next()
    只处理第一个标记

    导入java.io.BufferedWriter; 导入java.io.FileWriter; 导入java.io.IOException; 导入java.time.LocalDateTime; 导入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]);
            }
        }
    }
    

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

  • 添加
    input.nextLine();
    在所有
    nextLine()
    语句之后,
    nextInt()
    不能使用换行符(\n),因此它需要
    input.nextLine()
    捕获它,否则结果会出错

  • 使用
    String tmp[]=input.nextLine().split(“”;
    来解析空格分隔的行,
    next()
    只处理第一个标记

    导入java.io.BufferedWriter; 导入java.io.FileWriter; 导入java.io.IOException; 导入java.time.LocalDateTime; 导入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]);
            }
        }
    }
    

    你所说的数组线是什么意思?它只是一个包含一些整数的输入线,我应该在进入下一次迭代之前对它们进行解析,
    T
    n
    k
    是神秘的名称。请给出你的标识符的描述性名称,这样其他人就可以很容易地知道这些变量的用途。@VinceEmigh它们是JUt int变量,这里的名称并不重要,但是如果你想知道,我会给你一个链接,在那里你可以找到它们的描述:名称总是很重要。
    t
    表示一个
    size
    maxIndex
    K
    表示
    差异
    (如注释所述,如果您有描述性标识符,则不需要该注释)。这对我们很重要。你不应该强迫我们查看其他网站来解码你向我们展示的内容。你说的数组线是什么意思?它只是一个包含一些整数的输入线,我应该在进入下一次迭代之前解析它们。
    t
    n
    k
    都是神秘的名称。请给出你的标识符脚本名称,这样其他人就可以很容易地知道这些变量的用途。@Vinceeh可能它们只是int变量,这里的名称并不重要,但是如果你想知道,我会给你一个链接,在那里你可以找到它们的描述:名称总是很重要。
    T
    表示
    size
    maxIndex
    K
    代表
    差异
    (如注释所述,如果您有描述性标识符,则不需要)。这对我们很重要。您不应该强迫我们查看其他站点来解码您显示的内容。它给出:线程“main”java.lang中的异常。NumberFormatException:用于输入字符串:“看起来您的拆分方法正在套住空字符串,而这些字符串无法格式化为整数。请将它们解析出来。@mwm314 OP还需要在每次调用
    nextInt()后使用换行符。
    @haifzhan同意,很好。我想这就是空字符串从中弹出的地方:)。它给出:Excepti