【问题标题】:Read a single char using Scanner without removing it from the scanner使用扫描仪读取单个字符而不将其从扫描仪中删除
【发布时间】:2015-09-26 10:58:33
【问题描述】:

我正在编写一个解析器,我需要从输入中获取一个字符,然后根据这个字符的值更改控制流,我知道我可以做这样的事情input.next().charAt(0),但如果我不仅会这样做,而且整个下一个字符串都会从扫描仪中消失,这不是我想要的,所以有没有办法检查下一个字符的值而不将其从扫描仪中取出?

【问题讨论】:

  • 为什么不将input.next() 的结果存储在局部变量中?看来你走错路了。
  • 看起来像XY problem。你到底想做什么让你觉得你需要这个?
  • 这似乎很明显,但这不是我的解决方案,因为在这种情况下解析器的整个结构会被破坏,这个想法是解析只适用于扫描仪对象,而不使用“帮助”变量

标签: java character java.util.scanner


【解决方案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());
}

这会将每个字符打印两次。

【讨论】:

    【解决方案2】:

    当您从 Scanner 读取数据时,就会使用令牌。因此input.next().charAt(0)读出令牌然后告诉你0处的字符。

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

    子字符串 charAt(0)

    然后 subString 其余部分并在您的程序中使用它。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2015-05-02
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多