【问题标题】:Sorting NSArray of Dictionary containing Date as String将包含日期的字典的 NSArray 排序为字符串
【发布时间】:2020-04-08 20:05:56
【问题描述】:

我想根据日期参数对以下数组进行排序,但问题出在服务器上,我没有得到timestamp,我得到的日期是string,谁能帮忙。

    NSArray *array = @[
        @{@"valid":@"Y",@"mof":@"ON",@"dof":@"17-05-2019",@"rtntype":@"CODE1",@"ret_prd":@"042019"},
        @{@"valid":@"Y",@"mof":@"ON",@"dof":@"19-04-2019",@"rtntype":@"CODE1",@"ret_prd":@"032019"},
        @{@"valid":@"Y",@"mof":@"ON",@"dof":@"19-04-2019",@"rtntype":@"CODE2",@"ret_prd":@"032019"}
    ];

我已尝试应用该解决方案,但它不起作用,因为我们拥有的日期位于 NSString 而不是 NSDateNSTimeInterval

    [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

        if ([obj1 intValue] == [obj2 doubleValue])
            return NSOrderedSame;

        else if ([obj1 intValue] < [obj2 doubleValue])
            return NSOrderedAscending;

        else
            return NSOrderedDescending;

    }];

【问题讨论】:

  • 首先使用NSDateFormatterNSString 转换为NSDate,然后进行比较。另外,根据array,您的sortedArrayUsingComparator 将不起作用,应该崩溃,不是吗?你不应该比较obj1[@"dof"]obj2[@"dof"]吗?
  • 将日期字符串 day-month-year 更改为 day.month.year (如版本字符串)并使用此方法 developer.apple.com/documentation/foundation/nsstring/… 。在选项中通过NSNumericSearch
  • @BlindNinja 基本上,无论日期是用连字符还是句点分隔,API 都可以工作。但是,无论如何都无法可靠地对这种特定的日期格式进行排序。
  • @SomePerson 你负责服务器端吗?如果是,请将日期格式更改为yyyy-MM-dd。除非您按照第一条评论中的建议将其转换为NSDate,否则无法对问题中的日期字符串格式进行排序。
  • @vadian 我同意。我有与我描述的相同方法的工作代码(从未失败,手指交叉)。虽然更好地讲述工作代码。

标签: ios arrays objective-c sorting nsdate


【解决方案1】:

我假设您有特定的理由将数据保持原样,而不是解析成模型类,以便方便使用。

在您的场景中,您可以尝试使用以下代码对数组进行排序:

NSArray *array = @[
        @{@"valid":@"Y",@"mof":@"ON",@"dof":@"19-04-2019",@"rtntype":@"CODE1",@"ret_prd":@"032019"},
        @{@"valid":@"Y",@"mof":@"ON",@"dof":@"17-05-2019",@"rtntype":@"CODE1",@"ret_prd":@"042019"},
        @{@"valid":@"Y",@"mof":@"ON",@"dof":@"19-04-2019",@"rtntype":@"CODE2",@"ret_prd":@"032019"}
    ];

    //NSDateFormatter to convert NSString to NSDate
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"dd-MM-yyyy"];

    NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        if ([obj1 isKindOfClass:[NSDictionary class]]
            && [obj2 isKindOfClass:[NSDictionary class]]) {
            NSDictionary *dict1 = (NSDictionary *)obj1;
            NSDictionary *dict2 = (NSDictionary *)obj2;
            if ([dict1[@"dof"] isKindOfClass:[NSString class]]
                && [dict2[@"dof"] isKindOfClass:[NSString class]]) {
                NSString *dof1 = (NSString *) dict1[@"dof"];
                NSString *dof2 = (NSString *) dict2[@"dof"];
                NSDate *date1 = [formatter dateFromString:dof1];
                NSDate *date2 = [formatter dateFromString:dof2];
                return [date1 compare:date2];//Update the return based on in which order you want the resulting array
            }
        }
        return NSOrderedSame;
    }];
    NSLog(@"%@", sortedArray);

结果是:

(
        {
        dof = "19-04-2019";
        mof = ON;
        "ret_prd" = 032019;
        rtntype = CODE1;
        valid = Y;
    },
        {
        dof = "19-04-2019";
        mof = ON;
        "ret_prd" = 032019;
        rtntype = CODE2;
        valid = Y;
    },
        {
        dof = "17-05-2019";
        mof = ON;
        "ret_prd" = 042019;
        rtntype = CODE1;
        valid = Y;
    }
)

【讨论】:

  • 感谢 Hamza 的好解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2015-10-02
  • 2010-11-11
  • 2013-11-03
相关资源
最近更新 更多