Dan*_*sen 9 arrays sorting cocoa cocoa-touch objective-c
我有几个数组需要并排排序.
例如,第一个数组的名称为:@[@"Joe", @"Anna", @"Michael", @"Kim"],而另一个数组包含地址:@[@"Hollywood bld", @"Some street 3", @"That other street", @"country road"],数组的索引放在一起."乔"住在"好莱坞大道"等等.
我想按字母顺序对名称数组进行排序,然后将地址数组排在一起,这样它们仍然可以在一起,"好莱坞bld"具有与"Joe"相同的索引.我知道如何按字母顺序对一个数组进行排序
NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:NO];
[myArray sortUsingDescriptors:[NSArray arrayWithObject:sort]];
Run Code Online (Sandbox Code Playgroud)
但是有没有简单的方法来使用适当的顺序对第二个数组进行排序?
das*_*ght 11
p[i]=iname第一个数组的键对排列进行排序示例:假设第一个数组是{"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);
Run Code Online (Sandbox Code Playgroud)
Mon*_*olo 10
首先,您可能需要重新考虑一种架构,该架构要求您以这种并行方式对两个阵列进行排序.但话说回来,你可以通过创建一个临时的字典数组来保持两个数组的元素配对.
然后对组合数组进行排序,再次提取两个数组,按要求排序:
原始数据:
NSArray *names = @[@"Joe", @"Anna", @"Michael"];
NSArray *addresses = @[@"Hollywood bld", @"Some street 3", @"That other street"];
Run Code Online (Sandbox Code Playgroud)
实际的排序代码:
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"];
Run Code Online (Sandbox Code Playgroud)
请注意,valueForKey:在数组上使用的数据提取具有相同大小的新数组,并填充原始数组中对象的属性.在这种情况下,它从原始数组创建新数组,按需要排序.
这种方法只需要几行代码,并且如果需要,易于跟踪和调试.
最好的方法是重组您的数据,以便您只有一个数组。在您的示例中,最有意义的是创建一个具有名称和地址的新类,将它们放入一个数组中并按名称对其进行排序。