Проверьте, parsable ли строка в Long без выгоды попытки?

Long.parseLong("string") бросает ошибку, если строка не parsable в долго. Есть ли способ проверить строку быстрее, чем использование try-catch?Спасибо

60
задан Subodh Joshi 22 March 2016 в 08:53
поделиться

7 ответов

Вы можете создать довольно сложное регулярное выражение, но оно того не стоит. Использование исключений здесь абсолютно нормально.

Это естественная исключительная ситуация: вы предполагаете, что в строке есть целое число, но на самом деле есть что-то еще. Исключение должно быть выброшено и обработано должным образом.

Если вы заглянете внутрь кода parseLong , то увидите, что существует множество различных проверок и операций. Если вы хотите сделать все это перед синтаксическим анализом, это снизит производительность (если мы говорим о синтаксическом анализе миллионов чисел, потому что в противном случае это не имеет значения). Итак, единственное, что вы можете сделать , если вам действительно нужно для повышения производительности, избегая исключений, это: скопировать реализацию parseLong в свою собственную функцию и вернуть NaN вместо генерации исключений во всех соответствующих случаях. .

48
ответ дан 24 November 2019 в 17:46
поделиться

Вы могли бы попробовать использовать регулярное выражение для проверки формы строки, прежде чем пытаться ее проанализировать?

0
ответ дан 24 November 2019 в 17:46
поделиться

Я думаю, что это единственный способ проверить, является ли String допустимым длинным значением. но вы можете реализовать метод для этого, имея в виду наибольшее значение long.

2
ответ дан 24 November 2019 в 17:46
поделиться

Вы можете сделать что-то вроде

if(s.matches("\\d*")){
}

Используя регулярное выражение - чтобы проверить, заполнена ли строка s цифрами. Но что вы выиграете? другое условие if?

10
ответ дан 24 November 2019 в 17:46
поделиться

Есть гораздо более быстрые способы 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 и т. д. ).

2
ответ дан 24 November 2019 в 17:46
поделиться

Вы можете использовать ] java.util.Scanner

Scanner sc = new Scanner(s);
if (sc.hasNextLong()) {
   long num = sc.nextLong();
}

Также выполняет проверку диапазона и т. д. Конечно, он скажет, что «99 бутылок пива» hasNextLong () , поэтому, если вы хотите убедиться, что оно , только имеет длину вам придется делать дополнительные проверки.

5
ответ дан 24 November 2019 в 17:46
поделиться

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;
}
27
ответ дан 24 November 2019 в 17:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: