这是一项有趣的任务......
给出了很多版本字符串 - 假设它们或多或少是语义版semantic version数字,如1.2.3 - 什么是将它转换为long(在Java中)的方式,因此它保持“1.2 .34“小于”12.3.0“?
这是我到目前为止所拥有的
public static Long toLong(String version) {
if (version == null || version.isEmpty()) {
return 0L;
}
String[] parts = version.split("[^0-9]");
long number = 0L;
long factor = 1;
for (int b = parts.length - 1; b >= 0; b--) {
try {
Long l = Long.parseLong(parts[b]);
number += l * factor;
factor = factor * 100;
} catch (NumberFormatException e){
// silently ignored
}
}
return number;
}
假设字符串中的位置没有超过两位数(因此1.2.3.4567)将无法正常工作,但我可以忍受。但是我希望能有更快的东西。
答案 0 :(得分:0)
您可以在String
中执行类似的转换:
// add "." to format the major version
("." + versionString).
// replace each "." with "a00"
replaceAll("\\.", "a00").
// keep 2 digits, remove "a" and extra leading "0"
replaceAll("a0+([0-9]{2})", "$1");
该方法可以容易地用于输入字符串的不同数量的有效数字和/或不同格式。性能比你的toLong方法慢2.5倍(格式化1M版本字符串2.5秒)。如果性能比简单的代码更重要,那么比你的toLong方法快约5.5倍(1M字符串为0.2秒):
public static Long toLong2(String versionString)
{
if (versionString == null || versionString.isEmpty() )
{
return 0L;
} // end if empty
char[] C = versionString.toCharArray();
int i, i1 = 0, i2 = C.length;
Long l, number = 0L, factor = 1L;
try
{
for (i = C.length - 1; i > 0; i--)
{
if (C[i] == '.')
{
i1 = i + 1;
l = Long.parseLong(versionString.substring(i1, i2) );
i2 = i;
number += l * factor;
factor = factor * 100L;
} // end if '.'
} // end for i
l = Long.parseLong(versionString.substring(0, i2) );
number += l * factor;
}
catch (NumberFormatException e)
{
// silently ignored
} // end try
return number;
} // end method toLong2