可能重复:
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)
是否有任何内置功能可以正确排序?或者我应该开始编写排序算法吗?
答案 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);
}