我从Cay S. Horstmann和Gary Cornell的Java书中练习HashSet,我认为第687页的示例代码中存在错误。我们Scanner
导入了HashSet
个单词Set<String> words = new HashSet<String>();
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String word = in.next();
words.add(word);
}
1}}它看起来像这样(我删除了一些不需要的代码以使问题更加明显):
public static boolean isStop(Scanner in) {
if (in.next().equals("stop")) {
return true;
}
return false;
}
问题是没有办法阻止这个循环。或许还有我缺少的东西?
为了停止循环,我添加了另一个静态辅助方法:
Set<String> words = new HashSet<String>();
Scanner in = new Scanner(System.in);
while (!isStop(in)) {
String word = in.next();
words.add(word);
}
现在主代码看起来像这样:
{{1}}
还有其他方法可以阻止扫描仪循环吗?我无法相信这本书的作者犯了错误?
答案 0 :(得分:3)
一旦此条件为假,循环就会停止:
in.hasNext()
即,没有更多的话。
循环内部是一个读取下一个单词的命令:
in.next()
因此,在扫描仪无法阅读之前,将继续读取字词。该循环将在扫描仪正在读取的任何内容结束时终止。
答案 1 :(得分:1)
由于您正在扫描System.in
,因此循环不会停止,因为它会继续添加&#34;单词&#34;到Set
,但程序中没有明显的错误。
一旦用户输入与该关键字匹配,您选择关键字来停止循环的想法听起来不错。
您并不需要使用Scanner
作为参数的静态方法。
只需在String word = in.next();
之后添加以下内容:
if (word.equalsIgnoreCase("stop")) {
System.out.printf("Quitting with set: %s%n", words);
in.close();
return; // assuming method is void
}
答案 2 :(得分:1)
正如其他人所解释的那样,当输入中仍有单词时,扫描仪将继续运行。请注意,当我们谈论System.in
时,它通常会等到用户输入更多文本,因此在用户关闭流之前不会终止(为操作系统提供适当的文件结尾) )。在Unix / Linux中,要终止循环,用户需要使用control-D。
答案 3 :(得分:1)
循环不会停止,因为它会继续向Set
添加“单词”,但程序中没有明显的错误。
一旦用户输入与该关键字匹配,您选择关键字来停止循环的想法听起来不错。
您不需要使用Scanner
作为参数的静态方法。
只需添加更改代码,如下所示:
Set<String> words = new HashSet<String>();
Scanner in = new Scanner(System.in);
System.out.print("Type a word...");
while (in.hasNext()) {
String word = in.next();
if (word.equalsIgnoreCase("stop")) {
System.out.printf("Quitting with set: %s%n", words);
return; // assuming method is void
}
else {
words.add(word);
System.out.print("Type a word (or \"stop\" to quit)...");
}
}
答案 4 :(得分:1)