排序包含 NSMutableDictionaries 的 NSMutableArray

Sorting NSMutableArray that contains NSMutableDictionaries

我正在尝试找出 best/most 对包含 n 个字典的数组进行排序的有效方法。每个字典中的 key/value 对之一是日期字段。将所有字典添加到数组后,我想按日期降序对数组进行排序。

例如,我有这样的代码:

NSMutableArray *myArray = [[NSMutableArray alloc] init];

NSMutableDictionary *dictionary1 = [[NSMutableDictionary alloc] init];
    NSDate *today = [NSDate date];
    [dictionary1 setObject:today forKey:@"date"];
    [dictionary1 setObject:@"Another value" forKey:@"anotherKey"];

[myArray addObject:dictionary1];

NSMutableDictionary *dictionary2 = [[NSMutableDictionary alloc] init];
    NSDate *tomorrow = [[NSDate date] dateByAddingTimeInterval:60*60*24];
    [dictionary2 setObject:tomorrow forKey:@"date"];
    [dictionary2 setObject:@"Yet another value" forKey:@"anotherKey"];

[myArray addObject:dictionary2];

现在我需要按日期降序对 myArray 进行排序。 (数组索引 0 应该是最新日期)

注意:在我的实际项目中,我并没有以这种方式创建和添加词典。但是为了举例说明日期是如何存储在字典中的,假设我已经将这两个放入数组中。

您可以在此处使用 NSSortDescriptors:

NSMutableArray *myArray = [[NSMutableArray alloc] init];

NSMutableDictionary *dictionary1 = [[NSMutableDictionary alloc] init];
NSDate *today = [NSDate date];
[dictionary1 setObject:today forKey:@"date"];
[dictionary1 setObject:@"Another value" forKey:@"anotherKey"];

[myArray addObject:dictionary1];

NSMutableDictionary *dictionary2 = [[NSMutableDictionary alloc] init];
NSDate *tomorrow = [[NSDate date] dateByAddingTimeInterval:60*60*24];
[dictionary2 setObject:tomorrow forKey:@"date"];
[dictionary2 setObject:@"Yet another value" forKey:@"anotherKey"];

[myArray addObject:dictionary2];

NSSortDescriptor *sortDesciptor = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];

//Create new sorted array
NSArray *sortedArray = [myArray sortedArrayUsingDescriptors:@[sortDesciptor]];

//Or sort your mutable one
[myArray sortUsingDescriptors:@[sortDesciptor]];

有很多方法可以做到这一点。您可以像 Krivoblotsky 所说的那样使用 NSSortDescriptor。

也可以使用NSMutableArraysortUsingComparator的方法。代码看起来像这样:

[myArray sortUsingComparator
  ^(NSDictionary *obj1, NSDictionary *obj2)
  {
    return [obj1["date"] compare: obj2["date"]]
  }
];

sortUsingComparator 方法需要一个 NSComparator 块。

一个NSComparator接受两个id类型的对象,returns一个NSComparisionResult:

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);

由于 NSDate 支持比较方法,您只需编写 1 行比较器块即可获取每个字典的日期条目和 returns 比较它们的结果。