0

我有数据收集(NSArrayNSDictionary。现在在应用程序中,我需要以三种不同的排序顺序显示该数据。现在我不想制作 3 个不同的数组(每个排序顺序一个完整的数据),因为它会消耗内存,我也不想在每次用户更改排序选项时重新排序主数组。所以现在我的问题是,我想要一种机制,我只能以 3 个不同的排序顺序获取 3 个不同数组(或任何其他数据类型)中的主数组索引。我应该手动执行此操作,还是有内置方法从主数组获取排序索引数组?

4

5 回答 5

1

你问的是不可能的。您希望将您的项目按 3 个不同的顺序排序,而不是将它们保存到不同的数组中,并且每次排序方法更改时都不对它们进行排序。

你不能免费得到它。您可以使用内存或性能付费。我会去记忆,因为它不像你想象的那么昂贵。只有指向 NSDictionaries 的指针保存在您的数组中,因此它不应该占用太多内存。

于 2013-05-02T07:29:24.953 回答
0

不可能为不同的订单排序相同的数组。
每次排序前都需要保存数组。

于 2013-05-02T07:35:40.527 回答
0

NSArray 只接受对象作为它的元素。对象指针存储在数组中。所以我想,您正在谈论的选项,将索引保存在另一个数组中类似于按排序顺序保存指针。因此,您已经创建了 3 个不同的数组,其中包含以特定顺序指向对象的指针,这将是相同的,不会占用更多内存。当您将已排序的对象复制到新数组中时,不会再次分配对象,只会存储它们的指针。但是,您必须以正确的方式进行排序。

于 2013-05-02T07:50:12.767 回答
0

Step1:在之前声明枚举定义import statement

enum COMP_TYPE {
    LOCALIZE_COMPARE = 1,
    CASE_INSENSITIVE = 2,
    LOCALIZE_CASE_INSENSITIVE = 3
    };

Step2:在.m文件中定义以下函数

-(NSArray *)sortArray:(NSArray *)arr WithType:(int)type andKey:(NSString *)key andOrder:(BOOL)order
{
    SEL _compareSelector;
    switch (type) {
        case LOCALIZE_COMPARE:
            _compareSelector = @selector(localizedCompare:);
            break;
        case CASE_INSENSITIVE:
            _compareSelector = @selector(caseInsensitiveCompare:);
            break;
        case LOCALIZE_CASE_INSENSITIVE:
            _compareSelector = @selector(localizedCaseInsensitiveCompare:);
            break;

        default:
            break;
    }
     NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:key ascending:order selector:_compareSelector];
    return [arr sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
}

第三步:声明你的字典数组

NSArray *myArr = [NSArray arrayWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"stack", @"name",
                                   @"goa", @"name1",nil],
         [NSDictionary dictionaryWithObjectsAndKeys:@"stack", @"name",
          @"goa", @"name1",nil],
         [NSDictionary dictionaryWithObjectsAndKeys:@"objective", @"name",
          @"c++", @"name1",nil], nil];

Step4:调用不同参数的函数

NSLog(@"%@",[self sortArray:myArr WithType:LOCALIZE_COMPARE andKey:@"name" andOrder:YES]);
NSLog(@"%@",[self sortArray:myArr WithType:CASE_INSENSITIVE andKey:@"name" andOrder:YES]);
NSLog(@"%@",[self sortArray:myArr WithType:LOCALIZE_CASE_INSENSITIVE andKey:@"name" andOrder:YES]);
于 2013-05-02T08:27:12.457 回答
0

如果您想将数据保存在单个数组中,那么NSMutableArray只要排序条件发生变化,您就可以使用和(重新)对其进行排序。

但是请注意,这意味着如果您的数据数组是模型的一部分,并且您的排序顺序是一个表示 (UI) 问题,那么您实际上是在一个对象中混合了模型、视图和控制器功能。不好(:-))但不是历史上第一次发生。

这是一个直接在字典键上使用排序描述符的示例:

NSMutableArray *data = // ... your data as a mutable array

NSString* sortKey = // ... one of the 3 dictionary keys that you wish to sort by

NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:sortKey ascending:YES];

[data sortUsingDescriptors:@[sd]];

现在对data数组进行排序而不使用额外的数组变量。

于 2013-05-02T08:49:26.120 回答