使用扫描仪读取单个字符,而不从扫描仪中删除它

时间:2015-09-26 10:58:33

标签: java character java.util.scanner

我正在编写一个解析器,我需要从输入中获取一个char,然后根据此char的值更改控制流,我知道我可以执行类似select *, book_start- previous_book_end timeslot from ( select id, "from" book_start, "to" book_end, lag("to") over (order by "to") previous_book_end from test ) sub where book_start- previous_book_end >= '30m'::interval order by book_end id | book_start | book_end | previous_book_end | timeslot -----+---------------------+---------------------+---------------------+---------- 204 | 2015-09-24 12:00:00 | 2015-09-24 13:30:00 | 2015-09-24 10:30:00 | 01:30:00 309 | 2015-09-24 16:00:00 | 2015-09-24 17:30:00 | 2015-09-24 14:30:00 | 01:30:00 (2 rows) 的操作,但是如果我不仅会这个字符,但整个下一个字符串将从扫描仪中消失,这不是我想要的,那么是否有办法检查下一个字符的值而不将其从扫描仪中取出?

2 个答案:

答案 0 :(得分:1)

首先,逐个字符地处理, 你会想做这样的事情:

scanner.useDelimiter("");

在此之后,scanner.next()将逐个字符地读取。

您无法将数据放回扫描仪。 但是你可以将扫描仪包装在一个自定义类中,以创建放回东西的错觉。 例如:

class PeekableScanner {

    private final Scanner scanner;
    private String next;

    public PeekableScanner(Scanner scanner) {
        this.scanner = scanner;
        this.next = scanner.hasNext() ? scanner.next() : null;
    }

    public boolean hasNext() {
        return next != null;
    }

    public String next() {
        String current = next;
        next = scanner.hasNext() ? scanner.next() : null;
        return current;
    }

    public String peek() {
        return next;
    }
}

使用示例:

Scanner scanner = new Scanner("hello");
scanner.useDelimiter("");
PeekableScanner peekable = new PeekableScanner(scanner);

while (peekable.hasNext()) {
    System.out.println(peekable.peek());
    System.out.println(peekable.next());
}

这将打印每个角色两次。

答案 1 :(得分:0)

当您从扫描仪读取时,使用令牌。因此input.next().charAt(0)读出令牌,然后告诉你字符为0。

读取然后将令牌存储为字符串。

SubString charAt(0)

然后subString其余的并在你的程序中使用它。