Objective c 将两个NSARRAY并排排列在一起
我有几个数组需要并排排序 例如,第一个数组的名称为:Objective c 将两个NSARRAY并排排列在一起,objective-c,arrays,cocoa,cocoa-touch,sorting,Objective C,Arrays,Cocoa,Cocoa Touch,Sorting,我有几个数组需要并排排序 例如,第一个数组的名称为:@[@“Joe”、@“Anna”、@“Michael”、@“Kim”],以及 而另一个数组包含地址:@[@“好莱坞bld”,“Some street 3”,“the other street”,“country road”],这些数组的索引位于这些地址。“乔”住在“好莱坞bld”等等 我想按字母顺序对名称数组进行排序,然后将地址数组一起排序,这样它们仍然可以放在一起,而“Hollywood bld”的索引与“Joe”相同。我知道如何按字母顺序对
@[@“Joe”、@“Anna”、@“Michael”、@“Kim”]
,以及
而另一个数组包含地址:@[@“好莱坞bld”,“Some street 3”,“the other street”,“country road”]
,这些数组的索引位于这些地址。“乔”住在“好莱坞bld”等等
我想按字母顺序对名称数组进行排序,然后将地址数组一起排序,这样它们仍然可以放在一起,而“Hollywood bld”的索引与“Joe”相同。我知道如何按字母顺序对一个数组进行排序
NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:NO];
[myArray sortUsingDescriptors:[NSArray arrayWithObject:sort]];
但是,有没有什么简单的方法可以让第二个数组按照适当的顺序进行排序?您可以通过跟踪排序前后对象的索引来实现这一点,但如果有一个具有所有这些属性的对象,可能会更容易些
Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *addresss;
然后将这些对象存储到单个数组中,您可以按
名称
或地址
关键路径进行排序。最好的方法是重新构造数据,以便只有一个数组。在您的示例中,最有意义的做法是创建一个包含名称和地址的新类,将它们放在一个数组中并按名称排序
p[i]=i
名称
键对排列进行排序{“quick”、“brown”、“fox”}
。排列从{0,1,2}
开始,排序后变为{1,2,0}
。现在可以遍历置换数组,并根据需要对原始数组和第二个数组重新排序
NSArray *first = [NSArray arrayWithObjects: @"quick", @"brown", @"fox", @"jumps", nil];
NSArray *second = [NSArray arrayWithObjects: @"jack", @"loves", @"my", @"sphinx", nil];
NSMutableArray *p = [NSMutableArray arrayWithCapacity:first.count];
for (NSUInteger i = 0 ; i != first.count ; i++) {
[p addObject:[NSNumber numberWithInteger:i]];
}
[p sortWithOptions:0 usingComparator:^NSComparisonResult(id obj1, id obj2) {
// Modify this to use [first objectAtIndex:[obj1 intValue]].name property
NSString *lhs = [first objectAtIndex:[obj1 intValue]];
// Same goes for the next line: use the name
NSString *rhs = [first objectAtIndex:[obj2 intValue]];
return [lhs compare:rhs];
}];
NSMutableArray *sortedFirst = [NSMutableArray arrayWithCapacity:first.count];
NSMutableArray *sortedSecond = [NSMutableArray arrayWithCapacity:first.count];
[p enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSUInteger pos = [obj intValue];
[sortedFirst addObject:[first objectAtIndex:pos]];
[sortedSecond addObject:[second objectAtIndex:pos]];
}];
NSLog(@"%@", sortedFirst);
NSLog(@"%@", sortedSecond);
首先,您可能需要重新考虑一种体系结构,它要求您以类似这样的并行方式对两个阵列进行排序。尽管如此,您可以通过创建一个临时字典数组来实现这一点,该数组将两个数组的元素保持成对 然后对组合的数组进行排序,然后再次提取这两个数组,并根据请求进行排序: 原始数据:
NSArray *names = @[@"Joe", @"Anna", @"Michael"];
NSArray *addresses = @[@"Hollywood bld", @"Some street 3", @"That other street"];
实际排序代码:
NSMutableArray *combined = [NSMutableArray array];
for (NSUInteger i = 0; i < names.count; i++) {
[combined addObject: @{@"name" : names[i], @"address": addresses[i]}];
}
[combined sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]];
names = [combined valueForKey:@"name"];
addresses = [combined valueForKey:@"address"];
NSMutableArray*组合=[NSMutableArray];
对于(整数i=0;i
请注意,数组上使用的valueForKey:
提取具有相同大小的新数组,并填充原始数组中对象的属性。在本例中,它从原始数组创建新数组,并按需要排序
这种方法只需要几行代码,如果需要,很容易理解和调试。或者只创建一个字典数组,每个字典都包含一个名称和相应的地址。没错,尽管字典总是让我觉得有人不太关心数据的用途,无法很好地对其进行分类。:-)很好地使用了
-valueForKey:
。使用objectForKey
而不是valueForKey
。相关: