我已经使用用户输入指定了数组的大小,但是我的for循环只接受size-1时间的输入。
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int time=sc.nextInt();
String input[]=new String[time];
for(int i=0;i<time;i++)
{
input[i]=sc.nextLine();
}
for(int i=0;i<time;i++)
{
int len=input[i].length();
if(len>4)
{
System.out.println(input[i].charAt(0)+ Integer.toString(len-2)+input[i].charAt(len-1));
}
else
System.out.println(input[i]);
}
}
}
我改变了我的代码,它工作得很好改变了int time=sc.nextInt();
int time=Integer.parseInt(sc.nextLine());
但我不知道背后的原因。有人能解释一下吗?
Scanner.nextInt()
方法扫描下一个令牌作为int
的输入,而不是直线。例如,如果输入int
,然后按回车键,那么它只需要int
,而不需要回车。
如果你给出一个像这样的示例输入:
2 xyz //hit enter and give the next input
abc
您将看到nextInt()
将从该行获取2
作为输入,Scanner.nextLine()
即将到来的第一次迭代将考虑xyz
作为第一次输入,在下一个迭代中,正如我们给出的abc
一样,它将被视为第二次输入。所有这些时间你的代码都是工作的,但是你不能看到,因为它把空字符串作为第一个输入,因为从上一行返回回车。
然而,Scanner.nextLine()
将整行作为输入,以及回车,然后将int解析为整数,因此,您将获得数组的字符串输入的下一行。
希望这一切都清楚了。
问题是在第一个for
循环中使用的nextLine()
方法。因为这个方法将扫描器推进到下一行并返回被跳过的输入,所以它有点像"其中一个循环迭代,它最终允许您将time - 1
个元素输入到数组中,而不是time
个元素。如果只使用sc.next()
,程序就可以正常工作,因此不需要使用
int time=Integer.parseInt(sc.nextLine());
,因为它可能有点复杂(在我看来)比仅仅用next()
替换nextLine()
。下面是代码:
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int time = sc.nextInt();
String input[] = new String[time];
for(int i = 0;i < time;i++)
{
input[i] = sc.next();
}
for(int i = 0;i < time;i++)
{
int len = input[i].length();
if(len > 4)
{
System.out.println(input[i].charAt(0) + Integer.toString(len - 2) + input[i].charAt(len - 1));
}
else
System.out.println(input[i]);
}
sc.close();
}
}