我正在尝试添加fb好友分数表,我通过对它们进行排序来解决问题。根据要求,我得到两个可变数组,一个有朋友名,一个有分数。现在我需要按降序(从最高到最低)对分数进行排序。使用以下代码只能对分数进行排序:
NSSortDescriptor *scoreSorter= [[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
[self.friendScoresArray sortUsingDescriptors:[NSArray arrayWithObject:scoreSorter]];
但如果我这样做,我就会失去名称和分数之间的联系,所以我现在也需要对名称进行排序。以下是现在发生的事情:
请求后:
(姓名 - 分数)
名字一 - 110
名称二 - 120
名称三 - 100
排序后的分数:
名字一 - 120
名称二 - 110
名称三 - 100
这当然是显而易见的,但只是我得到的一个简单的例子。另外,我尝试过使用C ++的旧方法bubble泡法。它很有效,但它很慢,有时会提升,所以这在我看来是不好的做法。那么,在不失去名称与分数之间的联系的情况下,将这些分类到阵列的最佳方法是什么?谢谢。
答案 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;
}];
答案 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]];
}];