博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
版本号大小比较算法
阅读量:6442 次
发布时间:2019-06-23

本文共 2253 字,大约阅读时间需要 7 分钟。

版本号之间比较大小,本质上是比较字符串之间的关系。这里给定两个版本号,你一定能迅速地区分出大小:

0.0.20.0.3

想要让计算机程序分辨她们的关系,可以直接使用strcmp()函数获取返回值,如果你在 iOS 系统下编程,也可以使用 NSString 类提供的- (NSComparisonResult)compare:(NSNumber *)decimalNumber方法。

但如果版本进化成下面这样,上面所说的 API 一定会产生错误的结果。

2.7.14.23452.12.8.1234

因为单纯的字符串比较大小的依据是每个字符的 ASCII 码。程序会认为字符7比字符1大,结果就是第一个版本号大于第二个版本号,这是错误的。

因此在识别之前,有必要了解一下版本号的组成部分,以及每一个数字的意义,这里已 GUN 风格的版本号作为说明。

版本号大致以下几个部分组成:

  • 主版本号
  • 次版本号
  • 修正版本号
  • 编译版本号

示例: 3.5.20.9527

在比较版本号时,正确的做法应该是,主版本号和主版本号比较,次版本号和次版本号比较等等。所以算法的核心应该是分离出版本号的各个组成部分。由此产生的算法会有多种。这里列举一个方式最简单粗暴的 C 语言代码:

/** * 比较版本号 * * @param v1 第一个版本号 * @param v2 第二个版本号 * * @return 如果版本号相等,返回 0, *         如果第一个版本号低于第二个,返回 -1,否则返回 1. */int compareVersion(const char *v1, const char *v2) { assert(v1); assert(v2); const char *p_v1 = v1; const char *p_v2 = v2; while (*p_v1 && *p_v2) { char buf_v1[32] = { 0}; char buf_v2[32] = { 0}; char *i_v1 = strchr(p_v1, '.'); char *i_v2 = strchr(p_v2, '.'); if (!i_v1 || !i_v2) break; if (i_v1 != p_v1) { strncpy(buf_v1, p_v1, i_v1 - p_v1); p_v1 = i_v1; } else p_v1++; if (i_v2 != p_v2) { strncpy(buf_v2, p_v2, i_v2 - p_v2); p_v2 = i_v2; } else p_v2++; int order = atoi(buf_v1) - atoi(buf_v2); if (order != 0) return order < 0 ? -1 : 1; } double res = atof(p_v1) - atof(p_v2); if (res < 0) return -1; if (res > 0) return 1; return 0; }

Test case:

int main(int argc, char *argv[]) { assert(compare_version("2.2.1", "2.2.0") > 0); assert(compare_version("2.2.1", "2.1.9") > 0); assert(compare_version("2.2.1", "2.2.01") == 0); assert(compare_version("2.2.1", "2.2.1") == 0); assert(compare_version("2.2", "2.1.1") > 0); assert(compare_version("2.2", "2.2.1") < 0); assert(compare_version("2.2.3.1", "2.2.3.5") < 0); assert(compare_version("2.2.3.1", "2.2.3.0") > 0); assert(compare_version("2.2", "2.2.1.4.5") < 0); assert(compare_version("2.2.3.4", "2.2.4.4.5") < 0); assert(compare_version("2.2.3.4.5.6", "2.2.3.4.5.12") < 0); assert(compare_version("2.2.3.4.5.6", "2.2.2.4.5.12") > 0); assert(compare_version("3.0.0.1", "3.0.0.0.1") > 0); assert(compare_version("3.1", "3.1.") == 0); puts("test pass."); }

文/waylen(简书作者)
原文链接:http://www.jianshu.com/p/071c55963738
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
你可能感兴趣的文章
你刚才在淘宝上买了一件东西
查看>>
发布一个 Linux 下的 C++ 多线程库
查看>>
Python序列类型
查看>>
再谈ThinkPHP
查看>>
Hibernate问题浅析
查看>>
出现访问apache资源直接下载php文件的解决办法-----yum 安装 php mysql
查看>>
七种Mysql表类型
查看>>
归并与归并排序
查看>>
linux和windows互传文件、用户配置文件和密码配置文件、用户组管理、用户管理...
查看>>
spark 应用程序性能优化经验
查看>>
基于Zabbix IPMI监控服务器硬件状况
查看>>
Go语言之并发资源竞争
查看>>
mac本显示隐藏文件或关闭显示隐藏文件
查看>>
spring4.0 整合 Quartz 实现任务调度(一)
查看>>
android复杂布局的一点思路
查看>>
Awesome Python
查看>>
java web简单权限管理设计
查看>>
Google Analytics
查看>>
【转】什么是云计算
查看>>
MySQL 5.7及以上解压缩版本配置安装
查看>>