【问题标题】:How to test for blank line with Java Scanner?如何使用 Java Scanner 测试空行?
【发布时间】:2016-02-15 17:49:27
【问题描述】:

我期待扫描仪的输入,直到什么都没有(即当用户输入一个空行时)。我如何实现这一目标?

我试过了:

while (scanner.hasNext()) {
    // process input
}

但这会让我陷入困境

【问题讨论】:

    标签: java java.util.scanner


    【解决方案1】:

    这是一种方法:

    Scanner keyboard = new Scanner(System.in);
    String line = null;
    while(!(line = keyboard.nextLine()).isEmpty()) {
      String[] values = line.split("\\s+");
      System.out.print("entered: " + Arrays.toString(values) + "\n");
    }
    System.out.print("Bye!");
    

    【讨论】:

    • 这有一个副作用是已经获得了行(例如,如果我想解析用空格分隔的值,我需要用空格分隔行)。是否有 hasNextLine() 类型的方法,其中“指针”没有转到下一行?
    • @jiewmeng - 当您调用scanner.hasNext() 时,您仍需要获取该行以检查它是否为空并进行处理。您能解释一下为什么 Bart 的回答对您不起作用吗?
    • 分割线的问题在于它违背了Scanner的目的,即它可以帮助您进行标记化。
    【解决方案2】:

    来自http://www.java-made-easy.com/java-scanner-help.html

    问:如果我用 Java 的 Scanner 扫描一个空行会怎样?

    答:视情况而定。如果您使用 nextLine(),则会读取一个空行 in 作为一个空字符串。这意味着如果您要存储空白 字符串变量中的行,该变量将保存“”。它不会 商店“”或放置了许多空间。如果你使用 next(), 那么它根本不会读取空行。它们被完全跳过。

    我的猜测是nextLine() 仍然会在空行上触发,因为从技术上讲,扫描器将拥有空字符串""。所以,你可以检查if s.nextLine().equals("")

    【讨论】:

      【解决方案3】:

      使用scanner.nextLine() 的建议的问题在于它实际上将下一行返回为String。这意味着那里的任何文本都会被消耗掉。如果您有兴趣扫描该行的内容……好吧,太糟糕了!您必须自己解析返回的String 的内容。

      更好的方法是使用

      while (scanner.findInLine("(?=\\S)") != null) {
          // Process the line here…
          …
      
          // After processing this line, advance to the next line (unless at EOF)
          if (scanner.hasNextLine()) {
              scanner.nextLine();
          } else {
              break;
          }
      }
      

      由于(?=\S) 是一个零宽度的前瞻断言,它永远不会消耗任何输入。如果它在当前行中找到任何非空白文本,它将执行循环体。

      如果您确定循环体已经使用了该行中的所有非空白文本,则可以省略 else break;

      【讨论】:

      • 在这种情况下“消费”是什么意思?
      • @Jason210 "Consumed" 意味着如果你向扫描仪询问下一个项目,它会从下一行而不是当前行给你一些东西,因为扫描仪的状态已经移过了该行休息。
      【解决方案4】:
      Scanner key = new Scanner(new File("data.txt"));
      String data = "";
      
      while(key.hasNextLine()){
          String nextLine = key.nextLine();
      
          data += nextLine.equals("") ? "\n" :nextLine;
      
      }
      System.out.println(data);
      

      【讨论】:

        【解决方案5】:

        AlexFZ 是对的,scanner.hasNext() 将永远为真并且循环不会结束,因为总是有字符串输入,即使它是空的“”。

        我遇到了同样的问题,我是这样解决的:

        do{
            // process input
        }while(line.length()!=0);
        我认为do-while 更适合这里,因为您必须在用户输入后评估输入。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-27
          • 1970-01-01
          • 2023-03-17
          • 2015-05-11
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          相关资源
          最近更新 更多