gpt4 book ai didi

java - 将 semver 版本字符串 (10.2.3) 转换为 long

转载 作者:太空宇宙 更新时间:2023-11-04 14:59:12 32 4
gpt4 key购买 nike

这是一个有趣的任务...

给定很多版本字符串 - 假设它们或多或少是语义版本 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)将无法正常工作,但我可以接受。但我想要更快的东西。

最佳答案

您可以在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.4 倍(格式化 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

关于java - 将 semver 版本字符串 (10.2.3) 转换为 long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22811690/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com