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

时间:2012-08-07 03:33:18

标签: iphone ios nsmutablearray nsdictionary

我正在尝试对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];
    } ];

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

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

} ];

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

1 个答案:

答案 0 :(得分: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;
}];

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

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