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
    。相关: