2013-10-06 6 views
1

Je dois prendre une entrée contenant de grands nombres d'ordre 10^9 en Java. Comment gérer les entrées rapidement? Aussi puisque streamtokenizer.nval donne un double, comment puis-je lire des valeurs plus grandes?Streamtokenizer pour lire de très grands nombres?

+1

Vous pouvez essayer 'BigDecimal' – BackSlash

+0

qui ne vous aidera pas à prendre l'entrée. Ni en convertissant de double en BigInteger. – Renegade403

+0

1. Vous pouvez prendre l'entrée en tant que 'String' et la passer au constructeur' BigDecimal'; 2. Conversion de 'double' en' BigInteger' n'a pas de sens, parce que _it est pour les entiers_ et parce que les valeurs si grandes ne sont pas représentables avec un 'double', donc vous convertir une valeur erronée. – BackSlash

Répondre

0

Avant l'analyse syntaxique, réinitialiser la table de syntaxe tokenizer et l'initialiser à reconnaître les numéros comme mots:

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('\''); 

Puis, en rencontrant un mot, vous vérifiez si elle est analysable comme un nombre (ici un peu brut, mais il montre l'idée générale):

... 
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; 

que cela fonctionne dépend du cas d'utilisation: Si vous voulez analyser les expressions (et non seulement JSON comme dans mon cas), vous ne voulez probablement pas à mettre + ou - comme caractère de mot s, mais l'idée générale devrait encore fonctionner en les traitant comme des opérateurs unaires et en détectant des constantes à un stade ultérieur.

Questions connexes