Objective-C版本比较

时间:2012-11-29 22:13:29

标签: objective-c

  

可能重复:
  Comparing version numbers
  How to use compare on a version number where theres less parts in one number in Objective-C?

我正在尝试根据名为NSMutableArray的属性对referenceID个自定义对象进行排序,该属性基本上类似于版本号。

似乎将referenceID视为NSNumber并使用compareTo:对其进行排序几乎是正确的,但它破坏的地方如下:

Result:           Should Be:
1.1.1             1.1.1
1.1.10            1.1.2
1.1.2             ...
...               1.1.9
1.1.9             1.1.10

(Where ... is 1.1.2 through 1.1.9)

是否有任何内置功能可以正确排序?或者我应该开始编写排序算法吗?

2 个答案:

答案 0 :(得分:2)

如果你的引用id是一个字符串,你可以使用localizedStandardCompare:,它根据数字值比较字符串中的数字。

示例(带sortedArrayUsingComparator,因为OP在他的评论中使用了它):

NSArray *versions = @[@"2.1.1.1", @"2.10.1", @"2.2.1"];
NSArray *sorted = [versions sortedArrayUsingComparator:^NSComparisonResult(NSString *s1, NSString *s2) {
    return [s1 localizedStandardCompare:s2];
}];
NSLog(@"%@", sorted);

输出:

2012-11-29 23:51:28.962 test27[1962:303] (
    "2.1.1.1",
    "2.2.1",
    "2.10.1"
)

答案 1 :(得分:0)

使用块

对其进行排序
@autoreleasepool {
    //in this example, array of NSStrings
    id array = @[@"1.1.1",@"2.2",@"1.0",@"1.1.0.1",@"1.1.2.0", @"1.0.3", @"2.1.1.1", @"2.1.1", @"2.1.10"];

    //block
    id sorted = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSArray *comps1 = [obj1 componentsSeparatedByString:@"."];
        NSArray *comps2 = [obj2 componentsSeparatedByString:@"."];

        //get ints from comps
        int res1 = 0;
        for (int i=0; i<comps1.count; i++) {
            res1 += [comps1[i] intValue] * (4 - i);
        }
        int res2 = 0;
        for (int i=0; i<comps2.count; i++) {
            res2 += [comps2[i] intValue] * (4 - i);
        }

        return res1<res2 ? NSOrderedAscending : res1>res2 ? NSOrderedSame : NSOrderedDescending;
    }];

    NSLog(@"%@", sorted);
}