如何“查看”Java Scanner上的下一个元素?

也就是说,如何在不删除迭代器的情况下获取迭代器的下一个元素? 我可能会或可能不想根据其内容删除它。 我有一个文件扫描程序,我使用Scanner next()方法迭代XML标记。

提前致谢。

请参阅此答案以获得更有效的解决方案。

这是一个非常难看的解决方案,但您可以围绕Scanner创建一个包装类,它保留两个内部Scanner对象。 您可以通过让第二个扫描仪先于另一个扫描仪来获得peek()function

这是一个非常基本的解决方案(只是为了让您了解我正在谈论的内容)并且没有实现您需要的所有内容(但您只需要实现您将使用的那些部分)。 (另外,这是未经测试的,所以请用一粒盐)。

 import java.util.Scanner; public class PeekableScanner { private Scanner scan1; private Scanner scan2; private String next; public PeekableScanner( String source ) { scan1 = new Scanner(source); scan2 = new Scanner(source); next = scan2.next(); } public boolean hasNext() { return scan1.hasNext(); } public String next() { next = (scan2.hasNext() ? scan2.next() : null); return scan1.next(); } public String peek() { return next; } } 

这是另一种基于包装器的解决方案,但是这个只有一个内部扫描器。 我离开了另一个以显示一个解决方案,这是一个不同的,可能更好的解决方案。 同样,此解决方案并未实现所有内容(并且未经测试),但您只需实现您打算使用的那些部分。

在这个版本中,你将保持对next()实际上是什么的引用。

 import java.util.Scanner; public class PeekableScanner { private Scanner scan; private String next; public PeekableScanner( String source ) { scan = new Scanner( source ); next = (scan.hasNext() ? scan.next() : null); } public boolean hasNext() { return (next != null); } public String next() { String current = next; next = (scan.hasNext() ? scan.next() : null); return current; } public String peek() { return next; } } 

我不认为有类似peek的方法,但你可以使用hasNext(String)来检查下一个标记是否是你正在寻找的。

Google Guava中有一个PeekingIterator: https : //code.google.com/p/guava-libraries/wiki/CollectionHelpersExplained#PeekingIterator

如果Iterator是ListIterator,你可以这样做:

 if(it.hasNext()) { if(it.next() ... it.previous(); } 

我不知道你是否应该使用扫描仪,但你可以使用:

 Scanner s = ​new Scanner("a\nb")​​​​​​; s.hasNext(".*"); // ".*" matches anything, similar to hasNext(), but updates the scanner's internal match variable s.match().group(0)​;​ // returns "a" s.next() // returns "a"