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
A
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
- 1. Algorithme pour diviser de très grands nombres
- 2. Soustraction de très grands nombres de module
- 3. Calcul de très grands nombres entiers
- 4. Fonction de multiplier des nombres très petits ou très grands
- 5. Standard pour le sinus de très grands nombres
- 6. Exécution d'opérations mathématiques sur de très grands nombres en Perl
- 7. Mise en forme de très grands nombres en C
- 8. Générer de très grands nombres aléatoires en C++
- 9. mysql ordonnant des rangées par de très grands nombres.
- 10. Comment trouver un^b de très grands nombres en python?
- 11. Comparer de très grands nombres stockés dans une chaîne
- 12. Types pour les grands nombres
- 13. Comment le cpu gère-t-il les très grands nombres?
- 14. Multiplication de grands nombres
- 15. Problème avec scipy.optimize.fmin_slsqp lors de l'utilisation de très grands ou très petits nombres
- 16. Multiplication rapide de très grands entiers
- 17. Calcul de très grands exposants en python
- 18. Bibliothèque de grands nombres JavaScript?
- 19. En utilisant StreamTokenizer pour lire un fichier structuré
- 20. Débordement mathématique - Manipulation de grands nombres
- 21. R: erreur arithmétique pour les grands nombres
- 22. Comment diviser les grands nombres?
- 23. Puissance du module de grands nombres
- 24. Travailler avec des grands nombres
- 25. PHP exponentiation d'entiers (grands nombres)
- 26. Stockage de très grands entiers dans MySQL
- 27. Efficacité avec de très grands tableaux numpy
- 28. Python, mémoire insuffisante lors de l'itération sur de très grands nombres
- 29. Tracé de la pyramide R très lent si alimenté avec de plus grands nombres
- 30. La meilleure façon de traiter de très grands nombres longs dans Ajax?
Vous pouvez essayer 'BigDecimal' – BackSlash
qui ne vous aidera pas à prendre l'entrée. Ni en convertissant de double en BigInteger. – Renegade403
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