Как «просмотреть» следующий элемент на Java Scanner? - PullRequest
13 голосов
/ 27 ноября 2010

То есть как получить следующий элемент итератора, не удаляя его?Как я могу или не могу удалить его в зависимости от его содержания.У меня есть сканер файлов, где я перебираю теги XML, используя метод Scanner next ().

Заранее спасибо.

Ответы [ 6 ]

16 голосов
/ 27 ноября 2010

Вот еще одно решение на основе обертки, но у этого есть только один внутренний сканер.Я оставил другой, чтобы показать одно решение, это другое и, вероятно, лучшее решение.Опять же, это решение не реализует все (и не проверено), но вам нужно будет реализовать только те части, которые вы намереваетесь использовать.

В этой версии вы будете хранить ссылку на то, что 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;
    }
}
9 голосов
/ 27 ноября 2010

Я не думаю, что есть метод, похожий на просмотр, но вы можете использовать hasNext (String) , чтобы проверить, является ли следующий токен тем, что вы ищете.

7 голосов
/ 22 апреля 2014
4 голосов
/ 27 ноября 2010

См. этот ответ для более эффективного решения.

Это очень уродливое решение, но вы можете создать класс-оболочку вокруг 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;
    }
}
1 голос
/ 18 марта 2018

Гораздо проще ответить на все остальные:

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"
1 голос
/ 15 октября 2015

Если Iterator является ListIterator, вы можете сделать что-то вроде этого:

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