【问题标题】:How to exit infinite loop using "Enter" key?如何使用“Enter”键退出无限循环?
【发布时间】:2021-03-21 01:51:33
【问题描述】:

所以,我正在尝试使用“Enter”键退出无限循环,但我有点卡住了。有人可以帮我看看我哪里出错了吗?将不胜感激。或者甚至是更好的方法来做到这一点。我只是想让这成为一种学习体验

导入 java.util.Scanner;

类主{

public static void main(String[] args) {

System.out.println("Please enter a DNA sequence: ");

Scanner read = new Scanner(System. in );
String reverse = "";

while (true) {
  String input = read.next();

  StringBuilder DnaString = new StringBuilder();
  for (int i = input.length() - 1; i >= 0; i--) {
    reverse = reverse + input.charAt(i);
  }
  for (char c: input.toCharArray()) {
    switch (c) {
    case 'A':
      DnaString.append('T');
      break;
    case 'T':
      DnaString.append('A');
      break;
    case 'G':
      DnaString.append('C');
      break;
    case 'C':
      DnaString.append('G');
      break;
    default:
      DnaString.append(".");
      break;
    case '\u0000':
      return;
    }
  }
  System.out.println("Reversed DNA sequence =");
  System.out.println(DnaString + "");
  System.out.println("Enter a next DNA sequence (Press ___ to exit) : ");

}

} }

【问题讨论】:

    标签: java switch-statement java.util.scanner infinite-loop stringbuilder


    【解决方案1】:

    扫描仪是一种可以接收任何文本输入流(字符)并将其分割成不同部分的东西。

    它知道如何通过寻找所谓的分隔符模式将事物分割成碎片。任何 2 个分隔符模式之间的所有东西都称为 tokens。分隔符位被丢弃,只返回标记。因此,扫描器将任何输入分解为一系列标记 - 分隔符 - 标记 - 分隔符 - 标记 - 分隔符 - 等等,扔掉分隔符,并为您提供标记。可选地,通过调用例如.nextInt(),您要求它也以特定方式解释令牌。但是令牌/分隔符/令牌流程就是它的工作原理;如果您输入 '123hello',.nextInt() 将不会神奇地工作 - 那会崩溃,因为 '123hello' 将首先成为令牌,而 Int 部分仅在此之后开始,并要求将该令牌视为 int ,这是行不通的,因为它不是一个 int。 nextInt 只是为了方便Integer.parseInt(next()),仅此而已。

    因此,您真正想要的只是读取该换行符,或者更确切地说是空白输入,作为标记。

    但是,默认情况下,这是不可能的:新创建的扫描仪(因此,包括您在此处创建的)的分隔符模式"\\s+"。这是一个正则表达式,意思是:“1 个或多个字符,根据 unicode 规范,所有这些字符都算作空格”。输入是空格。制表符、空格和一系列更奇特的字符(如不间断空格)也是如此。

    一个换行符和多个换行符都只是扫描仪的一个分隔符。因此,不可能使用默认配置的扫描仪做你想做的事 - 作为分隔符一部分的所有字符都被扔掉,所以你需要将输入从“分隔符的一部分”移动到“令牌的一部分”,然后再次返回,以便查看您的 .next() 调用中的任何内容。

    对此有两种解决方案。通常建议但愚蠢的解决方案,以及不太常见的正确解决方案。

    • 正确的方法:"\\s+" 是错误的默认值。您通常想要的是分隔符是单个换行符,而不是“任何数量的空格”。这样,要读取整个名称(其中包含空格),只需调用.next()。每次回车都会分离 1 个令牌。现在,如果您多次按 Enter 键,您只会得到一堆空白字符串标记,您可以使用例如next(). It will return a blank string. To do that, immediately after invoking new Scanner, invoke: scanner.useDelimiter("\r?\n")`。此模式表示 windows 或 unix 上的换行符。

    • 不好的方式(我在这里解释它是因为你会听到这个建议,所以我最好解释一下为什么它是不好的建议,因为它很常见!):使用nextLine()。这完全放弃了定界符/标记的概念,但它不适用于扫描仪中的任何其他方法。例如,如果您调用nextInt() 来读取一个整数,然后调用nextLine() 来读取某人的全名,则它不起作用,因为nextLine() 实际上会返回从first 开始的所有字符导致最后一个 next() 方法返回的分隔符的字符(例如,在前一个标记的 last 字符之后),一直到换行符。因此,假设用户点击他们的年龄,点击回车并输入他们的姓名,nextLine() 调用不会返回任何内容:它返回该整数末尾和下一个换行符之间的字符,该换行符是空白的。这就是为什么脆弱和怪异是一个坏主意的原因。不要这样做。

    然后你需要做的就是修复你的代码,意识到String input = read.next()之后,input 将是空白的;例如input.isEmpty() 为真,input.length() 将返回 0,input.equals("") 为真。然后您可以退出 while 构造,例如带有break 声明。或者直接上System.exit(0); - 以您认为最好的为准。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 2018-04-29
      • 2020-06-06
      • 1970-01-01
      相关资源
      最近更新 更多