我正在编写一个解析器,我需要从输入中获取一个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)
的操作,但是如果我不仅会这个字符,但整个下一个字符串将从扫描仪中消失,这不是我想要的,那么是否有办法检查下一个字符的值而不将其从扫描仪中取出?
答案 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其余的并在你的程序中使用它。