Я думаю, что самый простой способ в этом вопросе использовать компаратор ..
NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil};
NSNumber *defaultScores[] = {@(600), @(500),@(400),@(50), nil};
NSDictionary *newScoreDict = [NSDictionary dictionaryWithObjects:defaultNames forKeys:defaultScores count:4];
NSArray *currScores = [newScoreDict keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ([obj1 integerValue] > [obj2 integerValue]) {
return NSOrderedAscending;
}else{
return NSOrderedDescending;
}}];
for (NSString *string in currScores) {
NSLog(@"%@",string);
}
попробуй это ..
Я заметил, что я не могу достичь значения с помощью объекта NSNumber, поэтому, если вы хотите достичь значения объекта, я решил изменить оценки NSNumber на NSString и преобразовать их в числа при заказе. Вы можете использовать, как показано ниже ..
NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil};
NSString *defaultScores[] = {@"600", @"500",@"400",@"50", nil};
NSMutableDictionary *newScoreDict = [NSMutableDictionary dictionaryWithObjects:defaultScores forKeys:defaultNames count:4];
NSArray *currScores = [newScoreDict keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber *number1 = [formatter numberFromString:obj1];
NSNumber *number2 = [formatter numberFromString:obj2];
if (number1.intValue > number2.intValue) {
return NSOrderedDescending;
}else{
return NSOrderedAscending;
}}];
for (NSString *name in currScores) {
NSLog(@"key %@ value %@",name,[newScoreDict valueForKey:name]);
}
Надеюсь, это поможет ..