问题描述
所以,我正在尝试使用“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);
- 以您觉得最好的方式为准。