也就是说,如何在不删除迭代器的情况下获取迭代器的下一个元素?因为我可能会或可能不想根据其内容删除它。我有一个文件扫描程序,我使用Scanner next()方法迭代XML标记。
提前致谢。
答案 0 :(得分:16)
这是另一种基于包装器的解决方案,但这只有一个内部扫描器。我离开了另一个以显示一个解决方案,这是一个不同的,可能更好的解决方案。同样,此解决方案并未实现所有内容(并且未经测试),但您只需实现您打算使用的那些部分。
在这个版本中,你会保留对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;
}
}
答案 1 :(得分:9)
我认为没有类似偷看的方法,但您可以使用hasNext(String)检查下一个令牌是否符合您的要求。
答案 2 :(得分:7)
Google Guava中有一个PeekingIterator: https://code.google.com/p/guava-libraries/wiki/CollectionHelpersExplained#PeekingIterator
答案 3 :(得分:4)
请参阅this答案以获得更有效的解决方案。
这是一个非常难看的解决方案,但您可以围绕Scanner
创建一个包装类,它保留两个内部Scanner
对象。您可以通过将第二个扫描程序放在另一个扫描程序之前来获得peek()
功能
这是一个非常基本的解决方案(只是为了让您了解我正在谈论的内容)并且没有实现您需要的所有内容(但您只需要实现您将使用的那些部分)。 (另外,这是未经测试的,所以请加上一粒盐)。
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;
}
}
答案 4 :(得分:1)
如果Iterator是ListIterator,你可以这样做:
if(it.hasNext()) {
if(it.next() ...
it.previous();
}
答案 5 :(得分:1)
对所有其他人的答案要简单得多:
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"