Long.parseLong("string")
бросает ошибку, если строка не parsable в долго. Есть ли способ проверить строку быстрее, чем использование try-catch
?Спасибо
Вы можете создать довольно сложное регулярное выражение, но оно того не стоит. Использование исключений здесь абсолютно нормально.
Это естественная исключительная ситуация: вы предполагаете, что в строке есть целое число, но на самом деле есть что-то еще. Исключение должно быть выброшено и обработано должным образом.
Если вы заглянете внутрь кода parseLong
, то увидите, что существует множество различных проверок и операций. Если вы хотите сделать все это перед синтаксическим анализом, это снизит производительность (если мы говорим о синтаксическом анализе миллионов чисел, потому что в противном случае это не имеет значения). Итак, единственное, что вы можете сделать , если вам действительно нужно для повышения производительности, избегая исключений, это: скопировать реализацию parseLong
в свою собственную функцию и вернуть NaN вместо генерации исключений во всех соответствующих случаях. .
Вы могли бы попробовать использовать регулярное выражение для проверки формы строки, прежде чем пытаться ее проанализировать?
Я думаю, что это единственный способ проверить, является ли String допустимым длинным значением. но вы можете реализовать метод для этого, имея в виду наибольшее значение long.
Вы можете сделать что-то вроде
if(s.matches("\\d*")){
}
Используя регулярное выражение - чтобы проверить, заполнена ли строка s цифрами. Но что вы выиграете? другое условие if?
Есть гораздо более быстрые способы parse длиннее, чем Long.parseLong . Если вы хотите увидеть пример метода, который не оптимизирован, вам следует взглянуть на parseLong:)
Вы действительно должны учитывать «цифры», не относящиеся к ASCII?
Вам действительно нужно сделать несколько вызовов методов с обходом системы счисления, даже если вы, вероятно, разбираете основание 10?
:)
Использование регулярного выражения - не лучший вариант: это сложнее чтобы определить, слишком ли велико ваше число надолго: как использовать регулярное выражение, чтобы определить, что 9223372036854775807 может быть проанализировано до длинного, а 9223372036854775907 - нет?
Тем не менее, ответ на действительно быстрый метод длинного синтаксического анализа - это конечный автомат, и это не имеет значения, хотите ли вы проверить, можно ли его анализировать или анализировать. Просто это не универсальный конечный автомат, принимающий сложные регулярные выражения, а жестко запрограммированный.
Я могу написать вам метод, который анализирует long, и еще один, который определяет, можно ли проанализировать long, который полностью превосходит Long.parseLong () .
Что вы хотите? Метод государственного тестирования? В этом случае метод тестирования состояния может быть нежелательным, если вы хотите избежать вдвое большей продолжительности вычислений.
Просто преобразуйте свой звонок в «try / catch».
И , если вам действительно нужно что-то более быстрое, чем стандартное Long.parseLong, напишите тот, который адаптирован к вашей проблеме: base 10, если вы base 10, без проверки цифр вне ASCII (потому что вас, вероятно, не интересуют японские itchi-ni-yon-go и т. д. ).
Вы можете использовать ] java.util.Scanner
Scanner sc = new Scanner(s);
if (sc.hasNextLong()) {
long num = sc.nextLong();
}
Также выполняет проверку диапазона и т. д. Конечно, он скажет, что «99 бутылок пива»
hasNextLong ()
, поэтому, если вы хотите убедиться, что оно , только имеет длину
вам придется делать дополнительные проверки.
From commons-lang StringUtils:
public static boolean isNumeric(String str) {
if (str == null) {
return false;
}
int sz = str.length();
for (int i = 0; i < sz; i++) {
if (Character.isDigit(str.charAt(i)) == false) {
return false;
}
}
return true;
}