我有数据收集(NSArray
)NSDictionary
。现在在应用程序中,我需要以三种不同的排序顺序显示该数据。现在我不想制作 3 个不同的数组(每个排序顺序一个完整的数据),因为它会消耗内存,我也不想在每次用户更改排序选项时重新排序主数组。所以现在我的问题是,我想要一种机制,我只能以 3 个不同的排序顺序获取 3 个不同数组(或任何其他数据类型)中的主数组索引。我应该手动执行此操作,还是有内置方法从主数组获取排序索引数组?
5 回答
你问的是不可能的。您希望将您的项目按 3 个不同的顺序排序,而不是将它们保存到不同的数组中,并且每次排序方法更改时都不对它们进行排序。
你不能免费得到它。您可以使用内存或性能付费。我会去记忆,因为它不像你想象的那么昂贵。只有指向 NSDictionaries 的指针保存在您的数组中,因此它不应该占用太多内存。
不可能为不同的订单排序相同的数组。
每次排序前都需要保存数组。
NSArray 只接受对象作为它的元素。对象指针存储在数组中。所以我想,您正在谈论的选项,将索引保存在另一个数组中类似于按排序顺序保存指针。因此,您已经创建了 3 个不同的数组,其中包含以特定顺序指向对象的指针,这将是相同的,不会占用更多内存。当您将已排序的对象复制到新数组中时,不会再次分配对象,只会存储它们的指针。但是,您必须以正确的方式进行排序。
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]);
如果您想将数据保存在单个数组中,那么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
数组进行排序而不使用额外的数组变量。