版本号大小比较算法
2016-05-27 00:00
281 查看
版本号大小比较算法
版本号之间比较大小,本质上是比较字符串之间的关系。这里给定两个版本号,你一定能迅速地区分出大小:0.0.2 0.0.3
想要让计算机程序分辨她们的关系,可以直接使用
strcmp()函数获取返回值,如果你在 iOS 系统下编程,也可以使用 NSString 类提供的
- (NSComparisonResult)compare:(NSNumber *)decimalNumber方法。
但如果版本进化成下面这样,上面所说的 API 一定会产生错误的结果。
2.7.14.2345 2.12.8.1234
因为单纯的字符串比较大小的依据是每个字符的 ASCII 码。程序会认为字符
7比字符
1大,结果就是第一个版本号大于第二个版本号,这是错误的。
因此在识别之前,有必要了解一下版本号的组成部分,以及每一个数字的意义,这里已 GUN 风格的版本号作为说明。
版本号大致以下几个部分组成:
主版本号
次版本号
修正版本号
编译版本号
示例: 3.5.20.9527
在比较版本号时,正确的做法应该是,主版本号和主版本号比较,次版本号和次版本号比较等等。所以算法的核心应该是分离出版本号的各个组成部分。由此产生的算法会有多种。这里列举一个方式最简单粗暴的 C 语言代码:
/** * 比较版本号 * * @param v1 第一个版本号 * @param v2 第二个版本号 * * @return 如果版本号相等,返回 0, * 如果第一个版本号低于第二个,返回 -1,否则返回 1. */ int compare_version(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[16] = {0}; char buf_v2[16] = {0}; char *i_v1 = strchr(p_v1, '.'); if (i_v1 != p_v1) { if (!i_v1) break; strncpy(buf_v1, p_v1, i_v1 - p_v1); p_v1 = i_v1; } else p_v1++; char *i_v2 = strchr(p_v2, '.'); if (i_v2 != p_v2) { if (!i_v2) break; 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; } if (*p_v1 || *p_v2) return (atof(p_v1) - atof(p_v2)) < 0 ? -1 : 1; return 0; }
相关文章推荐
- 5分钟学会枚举的正确使用姿势-Enumeration宏
- golang使用反射创建对象
- 云豹直播:如何抓住手机直播、互动直播的风口?
- 正则大全
- Quartz初步使用
- 华丽成长为IT高富帅、IT白富美(五)
- Xamarin 技术全解析
- for ... in 存在的浏览器兼容问题你造吗
- Effective C++: std::thread
- Nodejs pk Java 第1回合:初次交锋
- Lucene3.5 索引创建
- 学习Lucene3.5之一环境配置
- 堡垒机-麒麟开源堡垒机SSH公私钥认证配置文档
- 新手如何快速搭建一个网站
- 微信分销如何发展回头客?
- 在VMWare虚拟机Ubuntu系统下安装matlab
- SpringMVC学习--springmvc和mybatis整合
- springmvc4 相关注解的详细讲解
- Mysql 表分区技术
- dubbo+spring_mvc配置使用