当前位置: 首页 > 面试题库 >

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

陆弘光
2023-03-14
问题内容

我有一个与设备固件通信的应用程序。由于固件发生更改,因此使用格式对其进行了版本控制{major}.{minor}.{revision}[beta[{beta}]]。举几个例子,当前版本是0.4.7beta,之后是0.4.7beta2,有时0.4.70.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如果两个版本相同,它将返回。



 类似资料:
  • 问题内容: 我有两个字符串(它们实际上是版本号,它们可以是任何版本号) 我想比较哪个更大。在golang中如何做? 问题答案: 将“ 1.05.00.0156”转换为“ 0001” +“ 0005” +“ 0000” +“ 0156”,然后转换为int64。 将“ 1.0.221.9289”转换为“ 0001” +“ 0000” +“ 0221” +“ 9289”,然后转换为int64。 比较两个

  • 问题内容: 我无法将Java应用程序作为HTML中的Web小程序启动(我使用的是HTML4.01,我知道它在html5中不起作用)。它返回的错误消息是: java:不支持的major.minor版本52.0 我尝试降级Java JRE / JDK / SDK,但仍然收到相同的错误消息。我正在使用的Java当前版本是1.8.0_05。 问题答案: 使用Java版本1.7或更低版​​本执行代码时,您的

  • Windows 请按照下列步骤在 Windows 上升级 Navicat Monitor: 在通知区域中,右击 并选择“检查更新”。 如果有新版本,点击“安装”。 升级完成后,Navicat Monitor 会自动启动。 macOS 请按照下列步骤在 macOS 上升级 Navicat Monitor: 在菜单栏,点击 并选择“检查更新”。 如果有新版本,点击“安装更新”。 下载完成后,点击“安装

  • 问题内容: 在Eclipse中,我创建了一个链接到ejb和模型的EAR项目。我运行EAR时遇到以下错误: 无法部署Earkmz deploy is failing =部署期间发生错误:部署应用程序[earkmz]时发生异常:UnsupportedClassVersionError:分类it.j2ee.kmZ.business.impl.JPACartService具有不受支持的主要或次要版本号,该

  • 我正在使用sun/oracle jdk 1.6。0_32和javac编译器似乎为目标1.5 jvm而不是1.6创建类文件。它不会接受-source 1.6-Target 1.6。使用javap查看生成的类文件显示一个主要版本:49而不是我所期望的50。Eclipse Indigo正确地创建了1.6兼容的类文件,主要版本为:50。我第一次注意到这一点是在eclipse中使用ant 1.8.2时,无法