0

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

这是我的方法

-(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”,它返回我游戏中的所有建筑类型,但是如果我希望这些结果按照它们的名称按字母顺序排序呢?或者也许从它的黄金价值中按哪座建筑最昂贵?

4

2 回答 2

1

在您的代码中,如果 [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;
    }
于 2013-04-27T14:42:53.427 回答
1

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

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

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

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

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

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

于 2013-04-27T14:44:08.067 回答