Как я могу проверить, представляет ли строка длинную, двойную или обычную строку? Мне нужно это сделать, потому что это значение нужно проиндексировать в базе данных в соответствии с ее типом. В настоящее время я делаю это, пытаясь проанализировать строку и проверить исключения, но поскольку код вызывается очень часто, мне интересно, есть ли более эффективный способ сделать это. В настоящее время мой код выглядит так:
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
}
}
РЕДАКТИРОВАТЬ:
Я только что провел небольшое упражнение по тестированию производительности в соответствии с предложением @ 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