使用内部数组的最后一个元素对二维NSMutableArray进行排序

时间:2014-03-10 01:14:33

标签: sorting nsmutablearray

我有以下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中作为参数添加了什么。

2 个答案:

答案 0 :(得分:2)

你可以使用一个排序描述符,它接受" inner"的最后一个对象。数组并按此排序。

由于排序描述符使用键值编码(KVC),因此您需要注意数组以特殊方式响应valueForKey: - 它们将普通键传递给它们包含的每个对象。 / p>

你还需要知道采用参数返回值的方法可以通过KVC访问,如果它们是普通属性的话。

所有这些加起来如下:

  1. 数组中包含的每个对象(即内部数组)都有一个您要按其排序的键:lastObject
  2. 但由于对象是NSArray的实例,因此它们通常会将密钥传递给 包含的对象 - 这不是您想要的。
  3. 因此,您需要在该情况的密钥名称中使用特殊转义符@,使实际密钥使用@lastObject
  4. 所以长话短说,你可以用这种方式做你想做的事:

    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。我希望有所帮助。