1
我必须在Java中接受包含大量订单10^9的输入。如何快速处理输入?此外,由于streamtokenizer.nval给出了一个double,我怎样才能读取更大的值?Streamtokenizer读取非常大的数字?
我必须在Java中接受包含大量订单10^9的输入。如何快速处理输入?此外,由于streamtokenizer.nval给出了一个double,我怎样才能读取更大的值?Streamtokenizer读取非常大的数字?
解析之前,复位标记生成器的语法表,并初始化识别数字为一句话:
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在我的情况),你可能不希望设置+
或-
作为单词字符s,但总体思路仍然应该将它们当作一元运算符,并在稍后阶段检测常量。
你可以尝试'BigDecimal' – BackSlash
,这将不会帮助采取输入。无论是从双倍转换到BigInteger。 – Renegade403
1.您可以将输入作为“String”传递给'BigDecimal'构造函数; 2.从'double'转换为'BigInteger'没有任何意义,因为_it是整数_因为这么大的值不能用double来表示,所以你会转换错误的值。 – BackSlash