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