Как я могу проверить, представляет ли строка длинную, двойную или просто обычную строку? Мне нужно сделать это, потому что это значение должно быть проиндексировано в базе данных в соответствии с его типом. В настоящее время я делаю это, пытаясь разобрать строку и проверяя исключения, но поскольку код вызывается очень часто, мне интересно, есть ли более эффективный способ сделать это. Мой код в настоящее время выглядит так:
String value = ...;
// For example, could be "213678", "654.1236781", or "qwerty12345"
try {
Long longValue = Long.parseLong(value);
// Index 'longValue' in the database
} catch (NumberFormatException parseLongException) {
try {
Double doubleValue = Double.parseDouble(value);
// Index 'doubleValue' in the database
} catch (NumberFormatException parseDoubleException) {
// Index 'value' in the database
}
}
EDIT:
Я только что провел быстрое тестирование производительности в соответствии с предложением @ user949300 использовать шаблоны регулярных выражений, и оно показало себя немного лучше, чем код обработки исключений, приведенный выше. Вот код на тот случай, если кто-то найдет его полезным:
Pattern longPattern = Pattern.compile("^[-+]?[0-9]+$");
Pattern doublePattern = Pattern.compile("^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$");
// Check for long regex pattern before the double regex pattern
// since the former is a strict subset of the latter
if (longPattern.matcher(value).matches()) {
// Perform indexing for long in the database
} else if (doublePattern.matcher(value).matches()) {
// Perform indexing for double in the database
} else {
// Perform indexing for string in the database
}
Вот результаты сравнительного анализа для проверки 50 000 записей, где приблизительная разбивка типов составляет 50% длинных, 10% двойных, 40% строк (представляющих рабочую нагрузку, которую обрабатывает мое приложение):
--- Exception handling code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 2561 ms
--- Regex pattern matching code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 1565 ms