Sorting two NSArrays together side by side

前端 未结 4 767
一生所求
一生所求 2020-11-27 22:49

I have several arrays that need to be sorted side by side.

For example, the first array has names: @[@\"Joe\", @\"Anna\", @\"Michael\", @\"Kim\"], and a

4条回答
  •  一生所求
    2020-11-27 23:36

    1. Create a permutation array, initially set to p[i]=i
    2. Sort the permutation according to the name key of the first array
    3. Use the permutation to re-order both arrays

    Example: let's say the first array is {"quick", "brown", "fox"}. The permutation starts as {0, 1, 2}, and becomes {1, 2, 0} after the sort. Now you can go through the permutation array, and re-order the original array and the second array as needed.

    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);
    

提交回复
热议问题