1

我必须在 Java 中输入一个包含大量订单 10^9 的输入。如何快速处理输入?此外,由于 streamtokenizer.nval 给出了双倍,我怎样才能读取更大的值?

4

1 回答 1

0

在解析之前,重置分词器语法表并初始化它以将数字识别为单词:

StreamTokenizer tokenizer = new StreamTokenizer(r);
tokenizer.resetSyntax();

tokenizer.whitespaceChars(0, 32);

tokenizer.wordChars('0', '9');
tokenizer.wordChars('-', '.');
tokenizer.wordChars('+', '+');
tokenizer.wordChars('a', 'z');
tokenizer.wordChars('A', 'Z');
tokenizer.wordChars(0xa0, 0xff); // not really needed here. */
tokenizer.slashSlashComments(true);
tokenizer.slashStarComments(true);

tokenizer.quoteChar('"');
tokenizer.quoteChar('\'');

然后,当遇到一个单词时,检查它是否可以解析为数字(这里有点粗略,但它显示了大致的想法):

...
case StreamTokenizer.TT_WORD:
  if ("true".equals(tokenizer.sval)) {
    result = Boolean.TRUE;
  } else if ("false".equals(tokenizer.sval)) {
    result = Boolean.FALSE;
  } else if ("null".equals(tokenizer.sval)) {
    result = null;
  } else {
    try {
      result = Long.parseLong(tokenizer.sval);
    } catch(NumberFormatException e) {
      try {
        result = Double.parseDouble(tokenizer.sval);
      } catch (NumberFormatException e2) {
        throw new IllegalStateException(
           "Unexpected token: " + tokenizer.toString());
      }
   }
 }
 tokenizer.nextToken();
 break;

这是否有效取决于用例:如果您想解析表达式(而不仅仅是我的情况下的 JSON),您可能不想设置+-作为单词字符,但总体思路仍然应该通过将它们视为一元运算符并在稍后阶段检测常量。

于 2015-09-06T13:40:47.857 回答