Java书籍中的扫描仪示例不正确?

Java书籍中的扫描仪示例不正确?,java,Java,我正在练习Cay S.Horstmann和Gary Cornell的Java书中的HashSet,我认为第687页的示例代码中有一个错误。我们有一个扫描器将单词导入哈希集,它看起来是这样的(我删除了一些不需要的代码以使问题更加明显): 现在主代码如下所示: Set<String> words = new HashSet<String>(); Scanner in = new Scanner(System.in); while (!isStop(in)) { Str

我正在练习Cay S.Horstmann和Gary Cornell的Java书中的HashSet,我认为第687页的示例代码中有一个错误。我们有一个
扫描器
将单词导入
哈希集
,它看起来是这样的(我删除了一些不需要的代码以使问题更加明显):

现在主代码如下所示:

Set<String> words = new HashSet<String>();
Scanner in = new Scanner(System.in);
while (!isStop(in)) {
    String word = in.next();
    words.add(word);
}
Set words=newhashset();
扫描仪输入=新扫描仪(系统输入);
而(!isStop(in)){
字符串word=in.next();
添加(word);
}

有没有其他方法停止扫描仪循环?我不敢相信这本书的作者犯了错误?

一旦这个条件为假,循环就会停止:

in.hasNext()
也就是说,没有更多的词了

循环中有一个读取下一个单词的命令:

in.next()

因此,将继续读取单词,直到扫描仪没有更多的单词可读取。此循环将在扫描仪读取的任何内容结束时终止。

因为您正在扫描
系统。在
中,循环不会停止,因为它将继续向
集合添加“单词”
,但程序中没有可见错误

您选择一个关键字以在用户输入与该关键字匹配时停止循环的想法听起来不错

您实际上不需要使用
扫描仪作为参数的静态方法

只需在
String word=in.next()之后添加以下内容即可


正如其他人所解释的,当输入中仍有单词时,扫描仪将继续。请注意,当我们谈论
System.in
时,它通常会等待用户输入更多文本,因此在用户关闭流之前不会终止(为操作系统提供适当的文件结尾)。在Unix/Linux中,要终止循环,用户需要使用control-D。

循环不会停止,因为它会继续向
集合添加“单词”
,但程序中没有可见错误

您选择一个关键字以在用户输入与该关键字匹配时停止循环的想法听起来不错

您实际上不需要使用
扫描仪作为参数的静态方法

只需添加并更改代码,如下所示:

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)...");
    }
}
Set words=newhashset();
扫描仪输入=新扫描仪(系统输入);
系统输出打印(“键入单词…”);
while(在.hasNext()中){
字符串word=in.next();
if(字相等信号(“停止”)){
System.out.printf(“使用集合%s%n退出”,字);
return;//假设方法无效
}
否则{
添加(word);
System.out.print(“键入一个单词(或“停止”退出)……”;
}
}

如果循环后有代码要执行,那么是的,我认为作者犯了错误。给他们写信吧!如果这是一个向
集合添加项目的示例
,那么这个示例就可以了。这完全取决于作者对这个例子的意图


hasNext()
是一个阻塞方法,意味着它将始终等待更多输入。关于这件事,有很多不同的看法。“解决这个问题”的方法是大家一致同意的。

in.next()
推进解析器<.hasNext()中的code>in
检查是否还有其他输入需要读取。当没有更多的输入可供读取时,循环确实终止。@在本例中,
扫描仪正在扫描
系统。只要用户键入文本,它就会继续扫描。控制这种情况的一个好方法是基于关键字停止。当然,您也可以将
next
与空的
String
进行比较(即单回车符)。当用户键入文本时会发生什么情况?证明循环确实终止。没有代码表示循环等待输入更多文本。@如果用户按设计键入“停止[返回]”,循环将终止。我建议使用实际的IDE来测试代码。(in.equals(“stop”))已经停止了扫描仪。(!in.equals(“stop”)在这里不起作用。这就是为什么我做了另一个静态方法。谢谢,但是我能做什么使它变假呢?我没找到路,你什么都不做。此条件hasNext()是扫描程序扫描的流的自动检查,如果流中仍然有单词,则为“true”,如果没有,则为“false”。你可以“做”什么使它最终为假,就是继续在输入上运行程序,直到扫描仪完成。希望这个解释对你来说是清楚的,如果不是,请告诉我。谢谢,我先尝试了这个,但不知怎么的没有成功:)我像这样改变了它,它成功了,谢谢:boolean cont=true;while(cont){String word=in.next();if(word.equalsIgnoreCase(“stop”){cont=false;}@RichardK cool!我编辑了我的答案,提供了更多细节,以防对您有所帮助。谢谢。我还尝试关闭流并抛出异常。我找不到其他方法停止它,而是创建一个静态方法。用户(输入输入的人)应该通过发出适当的字符(unix/Linux/Mac中的ctrl-D,Windows中的ctrl-Z)来关闭流。请注意,在此之后,如果有其他尝试从System.in(或基于System.in的任何读卡器)读取的人他们不会读任何东西。整个代码不包含停止扫描仪循环的方法。我会通知书的作者,谢谢。
in.next()
if (word.equalsIgnoreCase("stop")) {
    System.out.printf("Quitting with set: %s%n", words);
    in.close();
    return; // assuming method is void
}
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)...");
    }
}