【问题标题】:sortUsingComparator on NSDictionary in NSMutableArray with multiple objectKeyssortUsingComparator 在 NSMutableArray 中的 NSDictionary 上具有多个 objectKeys
【发布时间】:2012-08-07 03:33:18
【问题描述】:

我正在尝试对 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 键对这些值进行排序。如果这不起作用,那么就下去排序之前的键列表..我希望这是有道理的..任何帮助将不胜感激。

【问题讨论】:

    标签: iphone ios nsmutablearray nsdictionary


    【解决方案1】:

    您几乎在问题中描述了解决方案:“如果描述键相同,则按 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]];
    

    【讨论】:

    • :P 好吧...我觉得我知道逻辑但不知道代码..我不知道调用 NSOrderedSame...我已经看到在类似问题中使用过..我应该尝试过那 :(... 我现在就试试看 :P 非常感谢你的回复 :)
    • 您给出的第二个示例是否会根据 sortDescriptorWithKey 不断更改数组..即对描述进行排序,然后通过 sortDescriptorWithKey 对 ID 进行更改等等...我要给出它以前..然后生病标记你!感谢所有帮助..第一个示例似乎对我很有用...即使我对这个想法有点迷失(当更高的对象键不一样时会发生什么..稍后继续排序较低的对象键值?或者他们离开了..我试图了解这方面的逻辑。
    • 我不知道您所说的“只是根据 sortDescriptorWithKey 不断更改数组”是什么意思。这两个示例都做同样的事情:它们根据“DESCRIPTION”键的值比较两个元素(字典)。如果“DESCRIPTION”键的值相等,他们只会查看“ID”键的值。
    • 是的..刚刚试了一下,效果一样..很抱歉让您感到困惑:P我以为它会做其他事情..但正如您所说,它们的工作方式相同..您认为第二种解决方案更快吗?不必处理 if 语句..或任何其他特定原因。非常感谢您的帮助:P
    • 我不知道哪个更快。如果重要的话,你应该两者都试一下。
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多