Мне нужно взять ввод, содержащий большие числа порядка 10^9 в Java. Как быстро обрабатывать Входы? Кроме того, поскольку streamtokenizer.nval дает двойной, как я могу читать большие значения?Streamtokenizer для чтения очень больших чисел?
1
A
ответ
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, как в моем случае), вы, вероятно, не хотите, чтобы установить +
или -
как символ слова с, но общая идея должна по-прежнему работать, рассматривая их как унарные операторы и обнаруживая константы на более позднем этапе.
Вы можете попробовать 'BigDecimal' – BackSlash
, которые не помогут в принятии ввода. Ни при преобразовании из double в BigInteger. – Renegade403
1. Вы можете принять ввод как 'String', передать его конструктору' BigDecimal'; 2. Преобразование из 'double' в' BigInteger' не имеет смысла, потому что _it для integers_ и потому, что такие большие значения не представляются с помощью 'double', поэтому вы бы конвертировали неправильное значение. – BackSlash