如何使用“Enter”键退出无限循环?

问题描述

所以,我正在尝试使用“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) : ");

}

} }

解决方法

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

它知道如何通过寻找所谓的分隔符模式来将事物分成几部分。任何 2 个分隔符模式之间的所有东西都称为 标记。分隔符位被丢弃,只返回令牌。因此,扫描器将任何输入分解为一系列标记 - 分隔符 - 标记 - 分隔符 - 标记 - 分隔符 - 等等,丢弃分隔符,并为您提供标记。可选地,通过调用例如.nextInt(),您要求它也以特定方式解释令牌。但是令牌/分隔符/令牌流就是它的工作原理;如果您输入“123hello”,.nextInt() 将不会神奇地工作 - 这将崩溃,因为“123hello”将首先成为令牌,而 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() 实际上会返回以 next() 方法返回的分隔符的 >first 字符(例如在前一个标记的 last 字符之后),一直到换行符。因此,假设用户点击他们的年龄,点击 Enter 并输入他们的名字,那个 nextLine() 调用不返回任何内容:它返回该整数末尾和下一个空白的换行符之间的字符。这就是为什么它是一个脆弱而奇怪的坏主意。不要这样做。

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