如何“窥视”Java Scanner上的下一个元素?

时间:2010-11-26 21:28:33

标签: java iterator

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

提前致谢。

6 个答案:

答案 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)

答案 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"