【问题标题】:Better way to replace unnecessary scan.nextLine(); to find StdIn String?替换不必要的更好的方法 scan.nextLine();找到 StdIn 字符串?
【发布时间】:2016-09-24 19:31:26
【问题描述】:

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

在本课 HackRank 30 天的代码(第 2 天)中,我们被要求从标准输入读取 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) 有没有更好的方法从扫描中定位字符串?

【问题讨论】:

    标签: java string java.util.scanner stdin


    【解决方案1】:

    scan.nextLine() 返回直到下一个新行分隔符或 \n 之前的所有内容。

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

    1 2.5
    whatever
    

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

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

    【讨论】:

    • 这有助于解决这个问题,通过使用 nextDouble 我只挑选出双而不是整行!有没有更雄辩的解决方案?
    • @AdamS.Cochran 据我所知,并非如此。这是我现在使用的方法。另外,如果对您有帮助,请记住将其标记为正确!
    【解决方案2】:

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

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

    【讨论】:

    • 虽然行数更少,但实际上所做的事情数量相同,所以我无法想象它的过程密集度更低,但格式肯定更好。我想我更多的是问是否有一种方法可以做到这一点而根本不需要额外的“nextLine”。
    【解决方案3】:

    scan.nextLine();
    为什么会有这个?我认为这就是为什么它搞砸了。
    另外我是如何学会这样做的。

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

    【讨论】:

    • 上面的代码 sn-p 是按原样工作的。我只是想知道是否有更好的方法来做到这一点。如果只有一个输入,您的方法也可以工作,在这个测试用例中,我们同时传递了 3 个输入,一个 Int、Double 和 String。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      简单的兄弟只使用 scan.next()

      【讨论】:

      • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
      猜你喜欢
      • 2017-10-07
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 2010-10-17
      • 2021-06-06
      相关资源
      最近更新 更多