我一直在研究HackerRank问题,并尝试在向任何社区寻求帮助之前一直研究解决方案。当我设法使当前的代码正常工作时,我感到其中包含一些不必要的代码,并且有人可以教我如何做得更好,因为我不想因为它有用而养成不良习惯。
在本课程HackRank 30天的代码中(第2天),我们被要求从Stdin读取3行(Int,Double和String),并使用扫描仪读取,保存和操作它们。
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.nextLine();只是在读取该行末尾的空格(这对我来说没有多大意义),并且如果我添加了额外的" scan.nextLine();"在声明我的字符串之前,它应该起作用。
果然做到了。我真的不明白为什么,当然也不觉得这是解决此问题的正确方法。看来,如果我不得不经常这样做,会膨胀代码吗?
任何人都可以阐明以下几点:
1)为什么用scan.nextLine();返回空白,直到我添加一个额外的?
2)是否有更好的方法从扫描中找到字符串?
要用更少的行编写代码,您可以读取换行符并在同一行中解析myDouble。
int myI = scan.nextInt();
double myDouble = Double.parseDouble(scan.nextLine());
String myString = scan.nextLine();
尽管行数较少,但实际上要做的事情数量相同,所以我无法想象它的处理强度较低,但格式肯定更好。 我想我是在问是否有办法完全不需要额外的" nextLine"。
scan.nextLine()返回所有内容,直到下一个新的行定界符或 n。
所以,我假设输入看起来像这样:
1 2.5
whatever
因此,该字符串实际上在第一行和第二行之间具有下一行定界符。 以前,当您没有多余的nextLine()时,会将您的字符串分配给一个空字符串,因为它占用了下一行定界符。
多余的nextLine()消耗了不必要的下一行分隔符,因此可以将您的字符串分配给您想要的字符串。
通过使用nextDouble,这有助于解决这个问题,我只是挑选出double而不是整个行! 有没有更雄辩的解决方案呢?
@ AdamS.Cochran据我所知,不是真的。 这是我现在使用的方法。 另外,请记住将其标记为正确,如果这对您有帮助!
scan.nextLine();
为什么在这里? 我认为这就是为什么将其弄乱。
我如何学会做到的也是这样。
System.out.println("Enter String");
String string = read.nextLine();
上面的代码段按原样工作。 我只是想知道是否有更好的方法。 如果只有一个输入,您的方法也可以工作,在此测试用例中,我们同时为3个输入传递了一个Int,Double和String。