在课程java.util.Scanner
中,方法public String next()
找到并返回此Scanner
中的下一个完整标记,如果我编写这样的程序,我很困惑:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println(in.next());
in.close();
}
然后运行这个程序,然后输入一个单词并打印出单词,似乎方法next()
返回当前标记,为什么API说next()
会返回下一个完整标记?< / p>
答案 0 :(得分:2)
我将描述所有这些是什么,因为你感到困惑。
Scanner input = new Scanner(System.in)
java.lang.System 是一个扩展 java.lang.Object 的公共最终类,它有静态字段,即错误和 类型 PrintStream 且 类型为 InputStream 因此,
System.in
java.util.Scanner 扩展 java.lang.Object 并实现以下接口:
现在我们理解了层次结构。执行期间会发生什么?
Execution of > Scanner input = new Scanner(System.in)
构造一个新的Scanner对象,向它传递它应该通过它输入的源。
Execution of > input.next()
执行以下步骤
只要您提供输入(假设如下)
"Hello World! This is a test."
然后点击输入,即可执行以下步骤
Iterator iterate = tokens.iterator()
类似的迭代器,用于迭代标记返回第一个完整令牌的原因是因为next()
继承自java.util.Iterator
的方法的行为。基本上可以把它想象成指向按顺序排列的扫描仪中的一堆标记的指针。一旦调用next()
,就返回第一个标记并将指针向前移动。
hasNext()
如果此扫描程序从迭代器指向的位置具有另一个标记,则返回true。与next()
不同,它不会超过令牌。
documentation对next()
说了以下内容查找并返回此扫描仪的下一个完整令牌。一个 完整标记之前和之后是匹配的输入 分隔符模式。此方法可能在等待输入时阻塞 扫描,即使之前的hasNext()调用返回true。
答案 1 :(得分:1)
这是因为您已将Scanner
指定为标准输入(System.in
)。
如果您使用此
中的确切程序 输出(在执行前检查stdin
的分配方式)
Success!
stdin // this is what you assign
hello word
stdout // this is the output of main method
hello
word
如果这没有澄清,也许你会发现这个例子很有用。检查我如何将Scanner
分配给已创建的String
:
String input = "hello my name is Jordi";
Scanner s = new Scanner(input); // assign the scanner to String s!!!!
System.out.println(s.next()); // prints: hello
System.out.println(s.next()); // prints: my
System.out.println(s.next()); // prints: name
System.out.println(s.next()); // prints: is
System.out.println(s.next()); // prints: Jordi
s.close();
答案 2 :(得分:0)
你可以认为,最初Scanner指向字符串的开头,然后当你调用next()时,它会从当前位置开始读取。 像这样:
[h][e][l][l][o][_]
^
扫描仪的行为类似于迭代器,并在“第一个字符之前”开始。