更好的方法来替换不必要的 scan.nextLine();找到 StdIn 字符串?
Better way to replace unnecessary scan.nextLine(); to find StdIn String?
我一直在研究 HackerRank 问题,并尝试在向任何社区寻求帮助之前始终研究解决方案。虽然我设法让当前的代码正常工作,但我觉得其中涉及一些不必要的代码,有人可以教我如何做得更好,因为我讨厌仅仅因为它有效就养成了一个坏习惯。
在本课 HackRank 30 days of Code(第 2 天)中,我们被要求从 Stdin 读取 3 行(一个 Int、一个 Double 和一个 String)并使用 Scanner 读取、保存和操作它们.
Scanner scan = new Scanner(System.in);
/* Declare second integer, double, and String variables. */
int myI = scan.nextInt();
double myDouble = scan.nextDouble();
scan.nextLine();
String myString = scan.nextLine();
扫描 Int 和 Double 很容易,但是当我尝试扫描 String 时,我 运行 遇到了一些问题:
A) 如果我使用 scan.next();我得到了一个单词而不是完整的字符串。
B) 如果我使用 scan.nextLine();我得到了一个空行。
经过一番研究,我发现有人建议我这样做是因为我刚刚做了 scan.nextDouble(); scan.next行();只是阅读该行末尾的空白(这对我来说没有多大意义),并且如果我在声明我的字符串之前添加额外的 "scan.nextLine();" 它应该可以工作。
果然如此。我真的不明白为什么,而且肯定不会觉得这是解决这个问题的正确方法。看来如果我不得不经常这样做只会使代码膨胀?
谁能解释一下:
1) 为什么 scan.nextLine();在我添加一个额外的之前一直返回空白?
2) 有没有更好的方法从扫描中定位字符串?
scan.nextLine() returns 直到下一个换行符或 \n.
所以,我假设输入看起来像这样:
1 2.5
whatever
所以,这个字符串实际上在第一行和第二行之间有一个下一行分隔符。之前,当您没有那个额外的 nextLine() 时,您的字符串被分配给一个空字符串,因为它占用了下一行分隔符。
额外的 nextLine() 消耗了不需要的下一行分隔符,因此您的字符串可以分配给您想要的内容。
为了减少代码行数,可以在同一行读取换行符和解析myDouble。
int myI = scan.nextInt();
double myDouble = Double.parseDouble(scan.nextLine());
String myString = scan.nextLine();
scan.nextLine();
为什么会有这个?我认为这就是它搞砸的原因。
我也是这样学会的。
System.out.println("Enter String");
String string = read.nextLine();
很明显,如果在nextInt()
方法之后立即使用nextLine()
方法,将读取blank/empty。这是因为 nextInt()
读取整数标记,因此该行(整数输入)的最后一个 newline 字符仍在输入缓冲区中排队。
这最终欺骗了下一个nextLine()
,最后它将读取整数行的剩余部分,它是空的。
据我所知,对于 Stdin,如果您必须在接受 integer/double/float 之后接受字符串输入,那么您必须使用虚拟 nextLine()
;欺骗输出。
简单兄弟仅使用 scan.next()
我一直在研究 HackerRank 问题,并尝试在向任何社区寻求帮助之前始终研究解决方案。虽然我设法让当前的代码正常工作,但我觉得其中涉及一些不必要的代码,有人可以教我如何做得更好,因为我讨厌仅仅因为它有效就养成了一个坏习惯。
在本课 HackRank 30 days of Code(第 2 天)中,我们被要求从 Stdin 读取 3 行(一个 Int、一个 Double 和一个 String)并使用 Scanner 读取、保存和操作它们.
Scanner scan = new Scanner(System.in);
/* Declare second integer, double, and String variables. */
int myI = scan.nextInt();
double myDouble = scan.nextDouble();
scan.nextLine();
String myString = scan.nextLine();
扫描 Int 和 Double 很容易,但是当我尝试扫描 String 时,我 运行 遇到了一些问题:
A) 如果我使用 scan.next();我得到了一个单词而不是完整的字符串。
B) 如果我使用 scan.nextLine();我得到了一个空行。
经过一番研究,我发现有人建议我这样做是因为我刚刚做了 scan.nextDouble(); scan.next行();只是阅读该行末尾的空白(这对我来说没有多大意义),并且如果我在声明我的字符串之前添加额外的 "scan.nextLine();" 它应该可以工作。
果然如此。我真的不明白为什么,而且肯定不会觉得这是解决这个问题的正确方法。看来如果我不得不经常这样做只会使代码膨胀?
谁能解释一下:
1) 为什么 scan.nextLine();在我添加一个额外的之前一直返回空白?
2) 有没有更好的方法从扫描中定位字符串?
scan.nextLine() returns 直到下一个换行符或 \n.
所以,我假设输入看起来像这样:
1 2.5
whatever
所以,这个字符串实际上在第一行和第二行之间有一个下一行分隔符。之前,当您没有那个额外的 nextLine() 时,您的字符串被分配给一个空字符串,因为它占用了下一行分隔符。
额外的 nextLine() 消耗了不需要的下一行分隔符,因此您的字符串可以分配给您想要的内容。
为了减少代码行数,可以在同一行读取换行符和解析myDouble。
int myI = scan.nextInt();
double myDouble = Double.parseDouble(scan.nextLine());
String myString = scan.nextLine();
scan.nextLine();
为什么会有这个?我认为这就是它搞砸的原因。
我也是这样学会的。
System.out.println("Enter String");
String string = read.nextLine();
很明显,如果在nextInt()
方法之后立即使用nextLine()
方法,将读取blank/empty。这是因为 nextInt()
读取整数标记,因此该行(整数输入)的最后一个 newline 字符仍在输入缓冲区中排队。
这最终欺骗了下一个nextLine()
,最后它将读取整数行的剩余部分,它是空的。
据我所知,对于 Stdin,如果您必须在接受 integer/double/float 之后接受字符串输入,那么您必须使用虚拟 nextLine()
;欺骗输出。
简单兄弟仅使用 scan.next()