在NSMutableArray中的NSDictionary上的sortUsingComparator,带有多个objectKeys

Hur*_*rkS 3 iphone nsdictionary nsmutablearray ios

我正在尝试对NSDictionaries的mutableArray进行排序,目前我可以通过使用一个objectForKey值进行排序来实现这一点,但是这个问题是很多这些值可以是相同的所以我需要让另一个objectForKey来对数组进行排序.我想知道,如果第一个objectForKey比较返回一个相同的值,我怎么能进行第二个objectForKey比较,依此类推......

目前我正在这样做,这有效..但显然只有一个键.

[dataArrayOfDictionaries sortUsingComparator:^ NSComparisonResult(NSDictionary *d1, NSDictionary *d2)
    {
        NSString *n1 = [d1 objectForKey:@"DESCRIPTION"];
        NSString *n2 = [d2 objectForKey:@"DESCRIPTION"];
        return [n1 localizedCompare:n2];
    } ];
Run Code Online (Sandbox Code Playgroud)

在我的调查中,我试过这个 -

[dataArrayOfDictionaries sortUsingComparator:^ NSComparisonResult(NSDictionary *d1, NSDictionary *d2)
{
    NSString *n1 = [d1 objectForKey:@"DESCRIPTION"];
    NSString *n2 = [d2 objectForKey:@"DESCRIPTION"];
    return [n1 localizedCompare:n2];
    n1 = [d1 objectForKey:@"ID"];
    n2 = [d2 objectForKey:@"ID"];
    return [n1 localizedCompare:n2];

} ];
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用,因为它对描述排序然后完全使用基于ID,我想要它如果描述键是相同的然后通过ID键对这些值进行排序..如果这不起作用然后下去的列表键直到它排序..我希望这是有道理的..任何帮助将非常感激.

rob*_*off 5

您几乎在问题中描述了解决方案:"如果描述键相同,则按ID键对这些值进行排序".您可以将该英语句子直接翻译成代码:

[dataArrayOfDictionaries sortUsingComparator:^ NSComparisonResult(NSDictionary *d1, NSDictionary *d2) {
    NSString *n1 = [d1 objectForKey:@"DESCRIPTION"];
    NSString *n2 = [d2 objectForKey:@"DESCRIPTION"];
    NSComparisonResult result = [n1 localizedCompare:n2];
    if (result == NSOrderedSame) {
        n1 = [d1 objectForKey:@"ID"];
        n2 = [d2 objectForKey:@"ID"];
        result = [n1 localizedCompare:n2];
    }
    return result;
}];
Run Code Online (Sandbox Code Playgroud)

您还可以使用两个NSSortDescriptor对象执行排序:

[dataArrayOfDictionaries sortUsingDescriptors:[NSArray arrayWithObjects:
    [NSSortDescriptor sortDescriptorWithKey:@"DESCRIPTION" ascending:YES
        selector:@selector(localizedCompare:)],
    [NSSortDescriptor sortDescriptorWithKey:@"ID" ascending:YES
        selector:@selector(localizedCompare:)],
    nil]];
Run Code Online (Sandbox Code Playgroud)