【问题标题】:Sorting results in Obj-c在 Obj-c 中对结果进行排序
【发布时间】:2013-04-27 14:24:25
【问题描述】:

我需要能够对我的 sort 方法的结果进行排序,但我不清楚如何做到这一点,我是否需要对以前的结果再次运行一个类似的方法,还是可以用一种方法完成?

这是我的方法

-(NSArray*)getGameTemplateObjectOfType:(NSString *) type
{
    NSArray *sortedArray;    

    if(editorMode == YES)
    {
        sortedArray = kingdomTemplateObjects;
    }
    else
    {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type CONTAINS[cd] %@", type];

        NSArray *newArray = [kingdomTemplateObjects filteredArrayUsingPredicate:predicate];

        NSSortDescriptor *sortDescriptor;
        sortDescriptor = [[NSSortDescriptor alloc] initWithKey:type
                                                     ascending:YES];
        NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

        sortedArray = [newArray sortedArrayUsingDescriptors:sortDescriptors];

    }


    return sortedArray;
}

type 被设置为“Building”,它返回我游戏中的所有建筑类型,但如果我希望这些结果按照名称按字母顺序排序怎么办?或者也许按照哪个建筑的黄金价值最贵来排序?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    你必须解析数组两次。 NSPredicate 不提供排序方式。查看NSPredicate Programming Guide。我实际上所做的是快速扫描NSPredicate BNF Syntax 以寻找排序运算符的明显迹象,例如 ASC 或 DESC。什么都没有。

    另外,这里有许多类似的问题:

    要告诉您的getGameTemplateObjectOfType:您希望如何对结果进行排序,您可以传入一些用于排序的键。例如:

    -(NSArray *)getGameTemplateObjectOfType:(NSString *)type sortedByKey:(NSString *)key ascending:(BOOL)ascending;
    

    但这样做可能会使您的代码复杂化——您必须在函数中处理所有键和类型的组合。 (如果你不明白我在说什么,请告诉我)。

    最后,您可能将过滤功能getGameTemplateObjectOfType: 改为:过滤。如果该函数的客户端希望以某种方式对结果进行排序,那么客户端可以这样做。然后你就会发现为什么 Apple 将这些功能分开了。

    【讨论】:

    • 对,所以这只是一个用稍微不同的方法多次扫描数组的问题。
    • 是的。但是您的复杂性确实没有增加,因此成本并不高。祝你好运!
    【解决方案2】:

    在您的代码中,如果 [kingdomTemplateObjects filteredArrayUsingPredicate:predicate];返回正确的结果

    然后您可以使用[newArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 对您的数组进行排序。

        -(NSArray*)getGameTemplateObjectOfType:(NSString *) type
        {
            NSArray *sortedArray;    
    
            if(editorMode == YES)
            {
                sortedArray = kingdomTemplateObjects;
            }
            else
            {
                NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type CONTAINS[cd] %@", type];
                NSArray *newArray = [kingdomTemplateObjects filteredArrayUsingPredicate:predicate];
                sortedArray = [newArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
            }
    
    
            return sortedArray;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      相关资源
      最近更新 更多