在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