2013-10-06 47 views
1

我必須在Java中接受包含大量訂單10^9的輸入。如何快速處理輸入?此外,由於streamtokenizer.nval給出了一個double,我怎樣才能讀取更大的值?Streamtokenizer讀取非常大的數字?

+1

你可以嘗試'BigDecimal' – BackSlash

+0

,這將不會幫助採取輸入。無論是從雙倍轉換到BigInteger。 – Renegade403

+0

1.您可以將輸入作爲「String」傳遞給'BigDecimal'構造函數; 2.從'double'轉換爲'BigInteger'沒有任何意義,因爲_it是整數_因爲這麼大的值不能用double來表示,所以你會轉換錯誤的值。 – BackSlash

回答

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在我的情況),你可能不希望設置+-作爲單詞字符s,但總體思路仍然應該將它們當作一元運算符,並在稍後階段檢測常量。