gpt4 book ai didi

java - 比较版本号字符串(主要、次要、修订、测试版)

转载 作者:搜寻专家 更新时间:2023-10-30 21:17:03 24 4
gpt4 key购买 nike

我有一个与设备固件通信的应用程序。由于固件有变化,它的版本格式为 {major}.{minor}.{revision}[beta[{beta}]]。举几个例子,当前版本是0.4.7beta,之后是0.4.7beta2,偶尔是0.4.7,之后通过 0.4.8beta。不幸的是,固件的版本控制格式不在我的控制之下,所以我无法更改它。

我需要一种相互比较固件的方法。基本上,我需要一个函数

boolean isFirmwareNewer(String testFW, String baseFW);

到目前为止,我所做的是将此格式转换为简单的 int。所以0.4.7beta2会变成00040702(每一级2位)。问题是,

  1. 我的代码很难阅读(>40 行和 3 个方法)
  2. 我敢肯定,对此有一个优雅的解决方案(也许使用正则表达式?)
  3. 我想要一个通配符0.0.0,它的定义较新
  4. 这会处理不正确的 beta 版本(0.4.7beta2 不比 0.4.7 更新)。这很容易解释 (if (testFW.contains("beta")) testFWValue -= 100;,但它也不是很优雅。

你们通常是怎么做的(或者你们会怎么做)?

如果你愿意,我可以附上我目前正在使用的代码,但正如我所说,它有超过 40 行代码并且不是真正可读的(这就是我正在寻找更好的方法来做到这一点的原因) .

最佳答案

这是一个建议:

static int[] getVersionNumbers(String ver) {
Matcher m = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)(beta(\\d*))?")
.matcher(ver);
if (!m.matches())
throw new IllegalArgumentException("Malformed FW version");

return new int[] { Integer.parseInt(m.group(1)), // major
Integer.parseInt(m.group(2)), // minor
Integer.parseInt(m.group(3)), // rev.
m.group(4) == null ? Integer.MAX_VALUE // no beta suffix
: m.group(5).isEmpty() ? 1 // "beta"
: Integer.parseInt(m.group(5)) // "beta3"
};
}

static boolean isFirmwareNewer(String testFW, String baseFW) {

int[] testVer = getVersionNumbers(testFW);
int[] baseVer = getVersionNumbers(baseFW);

for (int i = 0; i < testVer.length; i++)
if (testVer[i] != baseVer[i])
return testVer[i] > baseVer[i];

return true;
}

它使用了一个小技巧并将 beta 部分翻译如下:

  • ""(无 beta 后缀)→ Beta MAX_INT
  • “beta” → Beta 1(因为它在“beta2”之前)
  • “betaX” → Beta X

请注意,如果两个版本相同,则返回 true

关于java - 比较版本号字符串(主要、次要、修订、测试版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11501192/

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