Сортировка NSMutableDictionary
У меня есть NSMutableDictionary
, который отображает NSString
в NSString
(хотя значения NSStrings
, они действительно просто целые числа).
Например, рассмотрим следующие отображения,
"dog" --> "4"
"cat" --> "3"
"turtle" --> "6"
Я бы хотел получить 10 лучших записей в словаре, отсортированных по уменьшению порядка значения. Может ли кто-нибудь показать мне код для этого? Возможно, есть массив ключей и другой массив значений. Однако, я не против. Я просто стараюсь, чтобы это было эффективно.
Спасибо!
Ответы
Ответ 1
Получить массив значений, отсортировать этот массив, а затем получить ключ, соответствующий значению.
Вы можете получить значения с помощью:
NSArray* values = [myDict allValues];
NSArray* sortedValues = [values sortedArrayUsingSelector:@selector(comparator)];
Но, если сборка, как вы показываете в своем примере, (я имею в виду, вы можете вывести значение из ключа), вы всегда можете сортировать ключи, а не возиться со значениями.
Использование:
NSArray* sortedKeys = [myDict keysSortedByValueUsingSelector:@selector(comparator)];
Компаратор - это селектор сообщений, который отправляется объекту, который вы хотите заказать.
Если вы хотите заказать строки, вам следует использовать компаратор NSString.
Компараторы NSString: i. CaseInsensitiveCompare или localizedCaseInsensitiveCompare:.
Если ни одно из них не подходит для вас, вы можете вызвать свою собственную функцию компаратора
[values sortedArrayUsingFunction:comparatorFunction context:nil]
Быть compatorFunction (из AppleDocumentation)
NSInteger intSort(id num1, id num2, void *context)
{
int v1 = [num1 intValue];
int v2 = [num2 intValue];
if (v1 < v2)
return NSOrderedAscending;
else if (v1 > v2)
return NSOrderedDescending;
else
return NSOrderedSame;
}
Ответ 2
Самый простой способ:
NSArray *sortedValues = [[yourDictionary allValues] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSMutableDictionary *orderedDictionary=[[NSMutableDictionary alloc]init];
for(NSString *valor in sortedValues){
for(NSString *clave in [yourDictionary allKeys]){
if ([valor isEqualToString:[yourDictionary valueForKey:clave]]) {
[orderedDictionary setValue:valor forKey:clave];
}
}
}
Ответ 3
Сортировка ключей и их использование для заполнения массива со значениями:
NSArray *keys = [dict allKeys];
NSArray *sKeys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
NSMutableArray *sValues = [[[NSMutableArray alloc] init] autorelease];
for(id k in sKeys) {
id val = [dict objectForKey:k];
[sValues addObject:val];
}
Ответ 4
Используйте этот метод:
- (NSArray *)sortKeysByIntValue:(NSDictionary *)dictionary {
NSArray *sortedKeys = [dictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) {
int v1 = [obj1 intValue];
int v2 = [obj2 intValue];
if (v1 < v2)
return NSOrderedAscending;
else if (v1 > v2)
return NSOrderedDescending;
else
return NSOrderedSame;
}];
return sortedKeys;
}
Вызвать его, а затем создать новый словарь с ключами, отсортированными по значению:
NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:
@"4", @"dog",
@"3", @"cat",
@"6", @"turtle",
nil];
NSArray *sortedKeys = [self sortKeysByIntValue:dictionary];
NSMutableDictionary *sortedDictionary = [[NSMutableDictionary alloc] init];
for (NSString *key in sortedKeys){
[sortedDictionary setObject:dictionary[key] forKey:key];
}
Ответ 5
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest" ascending:YES];
[unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
recentSortedArray = [stories copy];
Ответ 6
если вы хотите сортировать данные в порядке возрастания для имени ключа для такого примера, это может вам помочь.
arrayAnimalList = [ { 'name' = Собака, 'animal_id' = 001 }, { 'name' = Rat, 'animal_id' = 002 }, { 'name' = Cat, 'animal_id' = 003 } ];
Это код, который поможет вам отсортировать массив
//here you have to pass key for which you want to sort data
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor];
// here you will get sorted array in 'sortedArray'
NSMutableArray * sortedArray = [[arrayAnimalList sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];