我知道有很多关于这个主题的问题,我为此道歉,因为我不能让这个为我的NSMutableArray工作。我有问题要真正理解排序,我一直在阅读文档
我有一个NSMutableArray,其中包含以下类型的数据:
球员姓名
得分
球员姓名
得分
球员姓名
得分
...
它是名称和分数(NSNumber)的组合。我试图找到一种方法来根据分数对此进行排序。我已经阅读了很多,但我只是没有让它工作,我也有问题理解排序的概念。我试图对整个数组进行排序,但是......
如果有人可以给我一个简短的,可理解的,对此排序方案的解释以及如何对此进行排序的示例,我将非常感激。
编辑:我改为字典,选择了值并且正在考虑对allObjects进行排序(在dict中存储为NSNumber),然后根据排序的对象从dict中选择键。
NSArray *allPlayers = [playerResultInTheGame allKeys];
NSArray *allObjects = [playerResultInTheGame allValues];
NSLog(@"allPlayers: %@", allPlayers);
NSLog(@"allObjects: %@", allObjects);
NSMutableArray *sortedArray = [allObjects sortedArrayUsingSelector:@selector(Compare:)];
运行时我得到以下内容:
2011-01-16 21:10:08.417 XX [6640:207] playerResultInTheGame:{
Barnspelare = 3;
Vuxenspelare = 3;
}
2011-01-16 21:10:08.418 XX [6640:207] allPlayers:(
Barnspelare,
Vuxenspelare
)
2011-01-16 21:10:08.418 XX [6640:207] allObjects:(
3,
3
)
2011-01-16 21:10:08.419 XX [6640:207] - [NSCFNumber比较:]:无法识别的选择器发送到实例0x5b26f10
2011-01-16 21:10:08.422 XX [6640:207] * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [NSCFNumber Compare:]:无法识别的选择器发送到实例0x5b26f10 '
有人可以请一些建议,因为我真的不明白吗?
答案 0 :(得分:2)
这里你需要做的是将你的得分和球员名字存储在字典中。使用玩家名称作为键(除非同一玩家被包含多次)并将分数作为值。然后,对球员进行排序就像这样简单:
NSDictionary *dict; // initialize dictionary with key/value pairs
NSArray *allPlayers = [dict allKeys];
根据需要对allPlayers
数组进行排序,然后从字典中获取分数。
答案 1 :(得分:0)
Lets go.
1) You need to create array of dictionaries. 2) Then sort it. 3) Then create final array of strings and numbers from sorted array of dictionaries.
//for example you have this
NSArray *allPlayers = @[@"John",@"Carl",@"Elena",@"Anna"];
NSArray *allAges = @[@30, @25, @16, @21];
//created storage to sort results
NSMutableArray *sortedPlayers = [NSMutableArray new];
[allPlayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
//I do not know if you have same count of player names and ages allways
//so just to prevent app crash check this situation
if (allAges.count <= idx){
*stop = YES;
return ;
}
[sortedPlayers addObject:@{
@"name":obj,
@"age":allAges[idx]
}];
}];
//let the sort begin
[sortedPlayers sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSNumber *age1 = obj1[@"age"];
NSNumber *age2 = obj2[@"age"];
//just leave comparing to the NSNumber object
return [age1 compare:age2];
}];
NSLog(@"Wow. It works!\n:%@",sortedPlayers);
//now you need the initial array with player\age values
NSMutableArray *result = [NSMutableArray new];
//append each pair to result
for (NSDictionary *obj in sortedPlayers){
NSString *name = obj[@"name"];
NSNumber *age = obj[@"age"];
[result addObject:name];
[result addObject:age];
}
NSLog(@"The final result is\n:%@",result);
这将在控制台中产生以下结果:
( 埃琳娜, 16, 安娜, 21, 卡尔 25, 约翰, 三十 )