Objective c 有没有办法重新排列数组列表的内容?

Objective c 有没有办法重新排列数组列表的内容?,objective-c,Objective C,有没有一种方法可以重新排列一个对象数组,使内容重新排列,使所有第x个元素都分组到另一个数组中?我不确定最好的解释方法,因此我将用一个例子来说明: 阵列有5个属性:数字、颜色、大小、高度和质量。此数组有50个实例,每个实例具有不同的属性 我想重新安排它,这样有5个数组,每个数组中有50个项目 我会这样做: NSMutableArray *innerTemp = [[NSMutableArray alloc] initWithCapacity:49]; NSMutableArray *outerTe

有没有一种方法可以重新排列一个对象数组,使内容重新排列,使所有第x个元素都分组到另一个数组中?我不确定最好的解释方法,因此我将用一个例子来说明:

阵列有5个属性:数字、颜色、大小、高度和质量。此数组有50个实例,每个实例具有不同的属性

我想重新安排它,这样有5个数组,每个数组中有50个项目

我会这样做:

NSMutableArray *innerTemp = [[NSMutableArray alloc] initWithCapacity:49];
NSMutableArray *outerTemp = [[NSMutableArray alloc] initWithCapacity:4];

for (int i = 0 ; i < [theArray count]; i++){
    [innerTemp addObject:[[theArray objectAtIndex:i] number]];
    [innerTemp addObject:[[theArray objectAtIndex:i] color]];
    [innerTemp addObject:[[theArray objectAtIndex:i] height]];
    [innerTemp addObject:[[theArray objectAtIndex:i] age]];
    [innerTemp addObject:[[theArray objectAtIndex:i] quality]];

    [outerTemp addObject:temp];
}
NSMutableArray*innerTemp=[[NSMutableArray alloc]initWithCapacity:49];
NSMutableArray*outerTemp=[[NSMutableArray alloc]initWithCapacity:4];
对于(int i=0;i<[阵列计数];i++){
[innerTemp添加对象:[[theArray对象索引:i]编号];
[innerTemp添加对象:[[theArray对象索引:i]颜色]];
[innerTemp添加对象:[[theArray对象索引:i]高度]];
[innerTemp添加对象:[[theArray对象索引:i]age];
[innerTemp添加对象:[[theArray对象索引:i]质量]];
[outerTemp addObject:temp];
}
所以我想我的问题是,有没有更简单/更有效的方法来做到这一点?

只需使用KVC():

假设您的类看起来像这样:

@interface InstanceClass : NSObject

// IIRC properties need to be objects (hence the NSValue around NSSize), there is no auto-wrapping.
@property (readwrite, strong, nonatomic) NSNumber *number;
@property (readwrite, strong, nonatomic) NSColor *color;
@property (readwrite, strong, nonatomic) NSValue *sizeValue;
@property (readwrite, strong, nonatomic) NSNumber *height;
@property (readwrite, strong, nonatomic) NSNumber *quality;

@end
你有一个像这样的数组

NSArray *instances = @[instance1, instance2, instance3, instance4, ...];
那么这就是你所需要的:

NSArray *numbers   = [instances valueForKey:@"number"];  // array of numbers.
NSArray *colors    = [instances valueForKey:@"color"];   // array of colors.
NSArray *sizes     = [instances valueForKey:@"size"];    // array of sizes.
NSArray *heights   = [instances valueForKey:@"height"];  // array of heights.
NSArray *qualities = [instances valueForKey:@"quality"]; // array of qualities.
这样就行了


假设您的
实例
数组中的项目从
1..n
编号,那么调用
[instances valueForKey:@“number”
将返回一个NSArray
[@1,@2,@3,@4,…]

这样数组存储一个具有属性的自定义对象
number
color
,等等?是的,每个数组都有一个具有5个properties@trojanfoe:或者只是看看我的(已经在那里了)p他们已经在自己的班上了;请参阅对他的问题的评论。在这种情况下,最后一个片段就足够了。@trojanfoe:请参阅此处:。这是一种非常聪明的KVC魔法方法。它基本上通过一个简单的方法调用实现了与for循环相同(甚至更多)的功能。使用
valueForKeyPath:
甚至可以提供(周期分隔的)关键路径并让它解析它们;但是OP在数组(不是字典)中有对象,并且希望属性在5个数组中。您的代码假设值在字典中,并且您没有显示将所有实例转换为字典的代码。不,它没有。请参阅有关NSarray如何响应
valueForKey:
的指南(我在前面的评论中发布了链接)。简言之:它们基本上将消息转发给它们的内容对象,并将它们的响应收集到一个新数组中,然后返回。阅读指南。值得这就是按键路径绑定到数组内容的工作方式。NSArrayController上“arrangedObjects.foo”的键值绑定正好做到了这一点(至少原则上是这样),例如。