【问题标题】:Comparing two version numbers比较两个版本号
【发布时间】:2013-09-06 19:18:39
【问题描述】:

如何比较两个版本号字符串?

例如:3.1.1 和 3.1.2.5.4

现在我需要确定 3.1.2.5.4 是否高于 3.1.1,但我不知道该怎么做。 有人可以帮帮我吗?

提前致谢!

【问题讨论】:

标签: ios compare version


【解决方案1】:

示例代码:

NSString* v1 = @"3.1.1";
NSString* v2 = @"3.1.2.5.4";

if ([v1 compare:v2 options:NSNumericSearch] == NSOrderedDescending) {
    NSLog(@"%@ is greater than %@",v1,v2);
}

来自Comparing and sorting strings 的 Apple 文档。

【讨论】:

  • 边缘情况:如果一个以.0 结尾而另一个不以.0 结尾则不起作用,例如@"3.1"@"3.1.0"。拆分解决方案(请参阅@pArAs 的答案)或填充可以处理此问题。
  • 确实如此。但是版本检查可能很乏味。查看我的 NSString 类别,该类别在 github 上捕获了所有边缘案例; github.com/stijnster/NSString-compareToVersion[@"1.2.2.4" compareToVersion:@"1.2.2.5"];
【解决方案2】:

是的,您可以比较版本,请参考以下代码:

public class Comparision {

    string ver1, ver2;
    public static void main(String args[]){
    string ver1Split[] = ver1.split('.');
    string ver2Split[] = ver2.split('.');

    for (int i = 0; i < ver1Split.length; ++i) {
        if (ver2Split == i) {
            return ver1 + " is larger";
        }

        if (ver1Split[i] == ver2Split[i]) {
            continue;
        }
        else if (ver1Split[i] > ver1Split[i]) {
            return ver1 + " is larger";
        }
        else {
            return ver2 + " is larger";
        }
        if (ver1Split.length != ver2Split.length) {
            return ver2 + " is larger";
        }
        return "versions are equal";
    }
}

【讨论】:

  • 您可以通过提供实际版本号来初始化字符串变量ver1和ver2。
  • 你的也可以,但 Vin 的解决方案更容易满足我的特定需求。不过还是谢谢!
【解决方案3】:

目标-C:

- (BOOL)isVersion:(NSString *)arg1 higherThan:(NSString *)arg2 {

    NSMutableString * v1 = arg1.mutableCopy;
    NSMutableString * v2 = arg2.mutableCopy;

    NSMutableArray * parts1 = [v1 componentsSeparatedByString:@"."].mutableCopy;
    NSMutableArray * parts2 = [v2 componentsSeparatedByString:@"."].mutableCopy;

    if (parts1.count > parts2.count) {

        NSInteger diff = parts1.count - parts2.count;

        for (NSInteger i = diff; i<parts1.count; i++) {
            [v2 appendString:@".0"];
        }

    } else if (parts1.count < parts2.count){

        NSInteger diff = parts2.count - parts1.count;

        for (NSInteger i = diff; i<parts2.count; i++) {
            [v1 appendString:@".0"];
        }

    }

    parts1 = [v1 componentsSeparatedByString:@"."].mutableCopy;
    parts2 = [v2 componentsSeparatedByString:@"."].mutableCopy;

    NSInteger j = 0;
    for (NSString * num1 in parts1) {
        NSString * num2 = parts2[j];
        if(num1.integerValue > num2.integerValue){
            //break;
            return YES;
        } else if (num1.integerValue < num2.integerValue) {
            //break;
            return NO;
        } else {
            // ==
        }
        j++;
    }

    return NO;
}

单元测试:

- (void)test_isHigherFunc {

    XCTAssert([self isVersion:@"4.1.2.1" higherThan:@"4.1.2.0"]);

    XCTAssertFalse([self isVersion:@"4.1.2.0" higherThan:@"4.1.2.0"]);

    XCTAssert([self isVersion:@"4.1.2.0" higherThan:@"4.1.1.0"]);

    XCTAssertFalse([self isVersion:@"3.1.2.0" higherThan:@"4.1.1.0"]);

    XCTAssertFalse([self isVersion:@"4.2.2.0" higherThan:@"4.3.1.0"]);

    XCTAssert([self isVersion:@"5.2" higherThan:@"4.3.1.0"]);

    XCTAssertFalse([self isVersion:@"6.2" higherThan:@"7.3.1.0"]);

    XCTAssert([self isVersion:@"6.2" higherThan:@"5"]);

    XCTAssert([self isVersion:@"6.2.0" higherThan:@"5.9"]);

    XCTAssert([self isVersion:@"1.1.1.1.1.1.1.1" higherThan:@"1.1.1.1.1.1.1.0"]);

    XCTAssert([self isVersion:@"2.0" higherThan:@"1"]);
}

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多