【问题标题】:Sort NSArray of NSDictionaries by string date in key?按键中的字符串日期对 NSDictionaries 的 NSArray 进行排序?
【发布时间】:2014-02-22 03:07:52
【问题描述】:

我一直在努力寻找一种简单的方法来对包含 NSDictionaries 的 NSMutableArray 进行排序。每个 NSDictionary 都有一个名为“Date”的键,其中包含一个日期的 NSString(例如:10/15/2014)。

我要做的是根据这些字符串按升序对数组进行排序。

我试过这个没有运气:

NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MM/dd/yy"];

    NSDate *d1 = [formatter dateFromString:s1];
    NSDate *d2 = [formatter dateFromString:s2];

    return [d1 compare:d2]; // ascending order
    return [d2 compare:d1]; // descending order
}

我也试过这个,但没有运气:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest"  ascending:YES];
    stories=[stories sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
    recent = [stories copy];

每种方式都会导致崩溃,我认为这是因为它是 NSString 而不是 NSDate,但我不知道如何做到这一点。

谁能告诉我正确的方法来完成这个?

这就是我调用第一块代码的方式:

theDictionaries = [[theDictionaries sortedArrayUsingFunction:dateSort context:nil] mutableCopy];

【问题讨论】:

  • 崩溃在哪一行,错误信息是什么?
  • 第一个代码块在 NSDate *d1 = [formatter dateFromString:s1];崩溃是:NSDictionaryI length]: unrecognized selector sent to instance
  • 听起来您正在将字典传递给字符串参数 (s1)。显示整个方法的代码。 s1 和 s2 是从哪里来的?
  • 我更新了问题的底部以包括我如何调用该方法。除此之外,这就是我对方法进行排序的全部内容。有什么我没看到的吗?

标签: ios sorting date nsarray nsdictionary


【解决方案1】:

您需要获取字典中的字符串。看起来您正在尝试比较字典本身。如果你有一个名为 data 的数组,你会做这样的事情,

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM/dd/yyyy"];

self.data = [self.data sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {
    NSDate *d1 = [formatter dateFromString:obj1[@"date"]];
    NSDate *d2 = [formatter dateFromString:obj2[@"date"]];

    return [d1 compare:d2]; // ascending order
    return [d2 compare:d1]; // descending order
}];

NSLog(@"%@",self.data);

【讨论】:

    【解决方案2】:

    如果你想使用模型类进行排序,那么你必须使用它。

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd hh:mm a"];
    
    finalCompleteArray = [finalCompleteArray sortedArrayUsingComparator:^NSComparisonResult(MessageChat *obj1, MessageChat *obj2) {
                            NSDate *d1 = [formatter dateFromString:obj1.LastDate];
                            NSDate *d2 = [formatter dateFromString:obj2.LastDate];
    
                            NSLog(@"[d1 compare:d2] %ld",(long)[d1 compare:d2]);
                            NSLog(@"[d2 compare:d1] %ld",(long)[d2 compare:d1]);
                            return [d2 compare:d1]; // descending order
                        }];
            NSLog(@"%@",finalAssignedArray);
    
    • 使用 finalCompleteArrayMutableArray
    • 使用MessageChat是对象模型类文件
    • 使用 obj1.LastDate 是对象模型类 Variable

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 2021-09-06
      • 2011-03-22
      • 1970-01-01
      • 2021-12-18
      • 2018-07-07
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多