0

可能的重复:
比较版本号
如何在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)

是否有任何内置函数可以正确排序?还是我应该开始编写排序算法?

4

2 回答 2

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"
)
于 2012-11-29T22:29:06.813 回答
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);
}
于 2012-11-29T22:16:57.017 回答