如何检查字符串是表示长字符串、双字符串还是普通字符串?我需要这样做,因为这个值需要根据其类型在数据库中进行索引。目前,我正在尝试解析字符串并检查异常,但由于代码被频繁调用,我想知道是否有更有效的方法。我的代码当前如下所示:
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
}
}编辑:
我只是按照@ use 949300关于使用regex模式的建议做了一个快速基准测试,它的性能略好于上面的异常处理代码。下面是代码,以防其他人发现它有用:
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发布于 2012-01-27 23:40:22
您考虑过正则表达式吗?
如果字符串包含-(开头)和0-9或.以外的任何内容,则它是一个字符串。(注意--这忽略了国际化和科学符号-它们是问题吗?)
否则,它包含一个.,它是一个双。(嗯,你应该只测试一次,但这是个开始)
否则,这是一个漫长的。
出于偏执,我仍然可能检查例外,但这可能是一个更快的方法。
注意,我猜想测试regex比从各种解析例程中抛出异常要快,但这可能不是真的。你应该做些测试。
发布于 2012-01-27 23:31:09
据我所知,没有其他优雅的方法可以做到这一点。我建议您按照最常见到最不常见的顺序解析它们,以便尽可能快地解析它们。
如果您有超过3种可能的类型,您将有一个深度和丑陋的try-catch嵌套,但从技术上讲,它将比将每次解析尝试放入自己的方法要快;这里的权衡是您希望代码清晰还是执行更快--听起来您可能想要后者。
发布于 2012-01-27 23:37:40
您可能会得到一些改进(特别是如果您可以排除科学符号,如1e12),只需检查非数字来检测一个长。
Long.parseLong()委托给在任何数字基中工作的通用方法,所以十进制方法可能会更快一些。
别忘了负号,如果这些在你的数据中是可能的.
由于654.1236871是有效的,所以加倍更难,但是654.12.36.87...1不是,尽管它们包含相同的字符集。因此,可能需要进行完整的解析。
https://stackoverflow.com/questions/9041437
复制相似问题