我有以下NSMutableArray:
(A|B|C|D|E|255,
F|G|H|I|J|122,
K|L|M|N|O|555)
我正在尝试使用最后一个组件(255,122,555)对数组中的对象进行排序。现在我有以下代码:
[myArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
正如所料,此方法按第一个元素(A,F,K)对数组进行排序。
我也读过NSSortDescriptor,例如:
NSSortDescriptor *sort = [[[NSSortDescriptor alloc] initWithKey:@"dateModified" ascending:YES] autorelease];
如果我使用它,我不清楚我在initWithKey
中作为参数添加了什么。
答案 0 :(得分:2)
你可以使用一个排序描述符,它接受" inner"的最后一个对象。数组并按此排序。
由于排序描述符使用键值编码(KVC),因此您需要注意数组以特殊方式响应valueForKey:
- 它们将普通键传递给它们包含的每个对象。 / p>
你还需要知道不采用参数和返回值的方法可以通过KVC访问,如果它们是普通属性的话。
所有这些加起来如下:
lastObject
NSArray
的实例,因此它们通常会将密钥传递给 包含的对象 - 这不是您想要的。@
,使实际密钥使用@lastObject
所以长话短说,你可以用这种方式做你想做的事:
NSMutableArray *array = ... // Your array
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey: @"@lastObject"
ascending: YES
selector: @selector(localizedCaseInsensitiveCompare:)];
[array sortUsingDescriptors: @[sd]];
你会注意到" @"在密钥名称中,在字符串中。
此转义字符也适用于其他集合类,例如,如果您想通过KVC从字典访问allKeys
,您应该使用的密钥是@allKeys
。
答案 1 :(得分:1)
我会使用sortUsingComparator:
[myArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [obj1.lastPropertyForComparison compare:obj2.lastPropertyForComparison];
}
此方法允许您手动比较要按顺序排列的对象的属性或成员。我几乎专门用于复杂的排序,我没有注意到任何性能差异。
更新: 如果您的NSMutableArray包含NSArrays,其中最后一个对象是您要排名的数字,那么您的比较器将如下所示:
[(NSNumber *)[obj1 lastObject] compare:(NSNumber *)[obj2 lastObject]]
基本上,你抓住每个NSArray中的最后一个对象,你知道它是一个NSNumber。您可以使用compare函数返回NSOrderedAscending,NSOrderedDescending或NSOrderedSame。我希望有所帮助。