2013-10-06 45 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,但总体思路仍然应该将它们当作一元运算符,并在稍后阶段检测常量。