排序两个NSMutableArray

时间:2014-08-11 15:12:16

标签: ios objective-c arrays xcode sorting

我正在尝试添加fb好友分数表,我通过对它们进行排序来解决问题。根据要求,我得到两个可变数组,一个有朋友名,一个有分数。现在我需要按降序(从最高到最低)对分数进行排序。使用以下代码只能对分数进行排序:

NSSortDescriptor *scoreSorter= [[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
[self.friendScoresArray sortUsingDescriptors:[NSArray arrayWithObject:scoreSorter]];

但如果我这样做,我就会失去名称和分数之间的联系,所以我现在也需要对名称进行排序。以下是现在发生的事情:
请求后:
(姓名 - 分数)
名字一 - 110
名称二 - 120
名称三 - 100
排序后的分数:
名字一 - 120
名称二 - 110
名称三 - 100 这当然是显而易见的,但只是我得到的一个简单的例子。另外,我尝试过使用C ++的旧方法bubble泡法。它很有效,但它很慢,有时会提升,所以这在我看来是不好的做法。那么,在不失去名称与分数之间的联系的情况下,将这些分类到阵列的最佳方法是什么?谢谢。

3 个答案:

答案 0 :(得分:1)

将每个名称和分数打包到一个对象中,将该对象粘贴到一个数组中,根据得分成员对该数组进行排序。我认为这种方法应该可以很好地运作。

答案 1 :(得分:1)

我会做这样的事情:

NSArray *_names = [NSArray arrayWithObjects:@"Jack", @"Zoe", @"Natalie", nil];
NSArray *_scores = [NSArray arrayWithObjects:@(110), @(120), @(100), nil];
NSMutableArray *_combined = [NSMutableArray array];

#define kName @"kName"
#define kScore @"kScore"

[_names enumerateObjectsUsingBlock:^(NSString * name, NSUInteger idx, BOOL *stop) {
    NSNumber *_score = [_scores objectAtIndex:idx];
    [_combined addObject:[NSDictionary dictionaryWithObjectsAndKeys:name, kName, _score, kScore, nil]];
}];

[_combined sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(NSDictionary * obj1, NSDictionary * obj2) {
    Float64 _score1 = [[obj1 valueForKey:kScore] doubleValue], _score2 = [[obj2 valueForKey:kScore] doubleValue];
    if (_score1 < _score2) return NSOrderedDescending;
    else return NSOrderedAscending;
}];

输入:

  • 杰克 - 110
  • Zoe - 120
  • 娜塔莉 - 100

输出:

  • Zoe - 120
  • 杰克 - 110
  • 娜塔莉 - 100

答案 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]];
}];