V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wwxiong
V2EX  ›  程序员

关于通用软件版本大小比对问题请教

  •  
  •   wwxiong · 360 天前 · 1234 次点击
    这是一个创建于 360 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当前有大量软件和版本数据,需要存储到数据库中。需求能对版本进行大小比对检索,软件版本格式不定(如下例子):

    • 1.2.3
    • 1.2.3.4
    • 1.2.3-alpha
    • 1.2.3-rc-1
    • 3.33.0-pre-alpha-8776953ad818
    • 3.25.0-beta9
    • 2020.3.38f1c2
    • 1.0.61.899.21511

    初步想法是所有软件版本均可通过程序转换成固定长度大小字符串(数字),然后就可以针对性的比较大小。不知道有没有比较好的方案处理,然后如果转换成固定长度大小字符串,有什么比较好的算法推荐吗?

    谢谢🙏

    9 条回复    2023-12-06 18:08:02 +08:00
    orluna
        1
    orluna  
       360 天前
    pkoukk
        2
    pkoukk  
       360 天前
    https://semver.org/
    应该各个语言都有各自的版本实现
    wwxiong
        3
    wwxiong  
    OP
       360 天前
    @orluna 不是算法题,就是版本比较多,想用通用的方法进行大小比对。
    wwxiong
        4
    wwxiong  
    OP
       360 天前
    @pkoukk 理论上是的,但是每个软件的版本格式都不一定一致,有些软件版本奇奇怪怪,想用个通用方式比对大小。
    pkoukk
        5
    pkoukk  
       360 天前
    @wwxiong #4 试试你说的那些奇奇怪怪的能不能 parse 出来呗,parse 不出来让他们按标准去改,不然没辙,你总不可能希望哪个随便自己捏的版本号 甲-辰-艮坎 也能识别吧。
    jim9606
        6
    jim9606  
       360 天前 via Android
    只管句点+数字分割的部分就是了,剩下的要么当不存在要么字典序。
    例如 windows 就强行规定需要使用版本号机制的组件都要用四段数字式版本号,android 只使用 versionNumber 做比较,versionCode 纯展示用
    AoEiuV020JP
        7
    AoEiuV020JP  
       360 天前
    按我的习惯,横线后面的直接按字符串比大小,横线前面的用小数点拆分按数字比大小,
    没什么特殊情况不会考虑把字符转成字符串去比大小,
    我这边有一个把数字转成字符串比大小的案例,是因为判断条件太多,为了简化比大小这块的逻辑所以把能转成字符串的都转成字符串了,比如 置顶大于非置顶,部门大于员工,经理大于其他员工,手动排序时间字段从大到小,最后还有拼音排序,都放在 Comparator 中根本写不好,只能是每个 item 算出一个字符串,最后对字符串比大小,

    不过你要存数据库比大小,不是很方便自定义 Comparator ,让我设计的话我会添加四个字段,三个数字,一个字符串, 不考虑数字部分超过 3 个的情况,真有就添加到后面字符串部分不管排序结果,
    mxT52CRuqR6o5
        8
    mxT52CRuqR6o5  
       360 天前
    格式完全不定的没法比啊,你像楼上发的那个 Semantic Versioning ,有规定的格式才有的比,格式不定的话我自己发明一种写法你咋比?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2573 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:30 · PVG 11:30 · LAX 19:30 · JFK 22:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.