Ios 将日期作为字符串的字典排序数组

Ios 将日期作为字符串的字典排序数组,ios,arrays,objective-c,sorting,nsdate,Ios,Arrays,Objective C,Sorting,Nsdate,我想根据Date参数对以下数组进行排序,但问题是来自服务器我没有得到时间戳,我得到的日期是字符串,请任何人帮助 NSArray *array = @[ @{@"valid":@"Y",@"mof":@"ON",@"dof":@"17-05-2019",@"rtntype":@"CODE1",@"ret_prd":@"042019"}, @{@"valid":@"Y",@"mof":@"ON",@"dof":@"19-04-2019",@"rtntype":

我想根据Date参数对以下数组进行排序,但问题是来自服务器我没有得到时间戳,我得到的日期是字符串,请任何人帮助

    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
中,而不是
NSDate
NSTimeInterval

    [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;

    }];
[使用比较器的阵列排序阵列:^n比较结果(id obj1,id obj2){
如果([obj1 intValue]==[obj2 doubleValue])
返回指定名称;
否则如果([obj1 intValue]<[obj2 doubleValue])
回报率下降;
其他的
退而求其次;
}];

我假设您有一个特定的原因来保持数据的原样,而不是解析到模型类中,让它方便使用

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

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;
    }
)

首先使用
NSDateFormatter
将该
NSString
转换为
NSDate
,然后对其进行比较。另外,根据
数组
,您的
SorterDarrayusingComparator
将无法工作,并且应该崩溃,不是吗?您是否应该将
obj1[@“dof”]
obj2[@“dof”]
进行比较?将日期字符串
day-month-year
更改为
day.month.year
(类似于版本字符串)并使用此方法。在options pass
NSNumericSearch
@BlindNinja中,不管日期是用连字符还是句点分隔的,API基本上都能工作。但是,这种特定的日期格式无论如何都无法可靠排序。@您是否有人负责服务器端?如果是,将日期格式更改为
yyyy-MM-dd
。问题中的日期字符串格式无法排序,除非您按照第一条注释中的建议将其转换为
NSDate
。@vadian我同意。我用我描述的方法编写了工作代码(从未失败,手指交叉)。不过最好告诉大家工作代码。感谢Hamza提供了很好的解决方案。