【问题标题】:Sorting NSMutableArray that contains NSMutableDictionaries [duplicate]对包含 NSMutableDictionaries 的 NSMutableArray 进行排序 [重复]
【发布时间】:2015-08-20 22:11:43
【问题描述】:

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

例如,我有这样的代码:

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 应该是最新日期)

注意:在我的实际项目中,我不会以这种方式创建和添加字典。但是为了查看日期是如何存储在字典中的,假设我已将这两个放入数组中。

【问题讨论】:

    标签: ios objective-c sorting nsmutablearray


    【解决方案1】:

    您可以在此处使用 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]];
    

    【讨论】:

      【解决方案2】:

      有很多方法可以做到这一点。正如 Krivoblotsky 所说,您可以使用 NSSortDescriptor。

      您也可以使用NSMutableArray sortUsingComparator 方法。代码看起来像这样:

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

      sortUsingComparator 方法采用 NSComparator 块。

      NSComparator 接受两个 id 类型的对象,并返回一个 NSComparisionResult

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 2010-10-22
        • 1970-01-01
        相关资源
        最近更新 更多