更换不必要的scan.nextLine()的更好方法;找到StdIn String?

时间:2016-05-26 16:54:35

标签: java string java.util.scanner stdin

我一直在解决HackerRank问题并尝试在向任何社区寻求帮助之前总是研究解决方案。虽然我设法让当前的一个工作,我觉得有一些不必要的代码涉及,有人可以教我如何做得更好,因为我不想因为它的工作而养成一个坏习惯。

在本课程HackRank 30天的代码(第2天)中,我们被要求从Stdin读取3行(Int,Double和String)并使用扫描程序读取它们,保存并操纵它们。 / p>

    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很容易,但是当我尝试扫描字符串时遇到了一些问题:

A)如果我使用了scan.next();我找回了一个单词而不是完整的字符串。

B)如果我使用了scan.nextLine();我找回了一条空白。

经过一番研究后,我发现有人建议,因为我刚做了一个scan.nextDouble(); scan.nextLine();只是阅读该行末尾的空白(这对我来说没什么意义),如果我添加了额外的“scan.nextLine();”在声明我的字符串之前它应该有用。

果然它确实如此。我真的不明白为什么,而且当然不觉得这是解决这个问题的正确方法。似乎如果我不得不经常这样做,它会使代码膨胀吗?

任何人都可以了解一下:

1)为什么要scan.nextLine();是否一直空白,直到我添加了一个?

2)有没有更好的方法从扫描中找到字符串?

4 个答案:

答案 0 :(得分:1)

scan.nextLine()将所有内容返回到下一个新行分隔符,或者\ n。

所以,我假设输入看起来像这样:

1 2.5
whatever

因此,该字符串实际上在第一行和第二行之间具有下一行分隔符。之前,当你没有额外的nextLine()时,你的字符串被分配给一个空字符串,因为它消耗了下一行分隔符。

额外的nextLine()正在消耗不需要的下一行分隔符,因此您的字符串可以分配给您想要的字符串。

答案 1 :(得分:1)

要用更少的行编写代码,您可以读取换行符并在同一行中解析myDouble。

    int myI = scan.nextInt();
    double myDouble = Double.parseDouble(scan.nextLine());
    String myString = scan.nextLine();

答案 2 :(得分:0)

scan.nextLine();
这是为什么?我想这就是为什么搞乱它。
我也学会了这样做是这样的。

    System.out.println("Enter String");
    String string = read.nextLine();  

答案 3 :(得分:0)

很明显,如果您在 nextInt() 方法之后立即使用 nextLine() 方法将读取空白/空。这是因为 nextInt() 读取整数标记,因此该行的最后一个换行符(整数输入)仍在输入缓冲区中排队。 这最终会欺骗下一个 nextLine(),最终它将读取整数行的其余部分,这是空的。

因此,据我所知,对于 Stdin,如果您必须在接受整数/双精度/浮点数后接受字符串输入,那么您必须使用虚拟的 nextLine();欺骗输出。