Сортировать NSMutableDictionary - PullRequest
       10

Сортировать NSMutableDictionary

19 голосов
/ 30 декабря 2010

У меня есть NSMutableDictionary, который отображает NSString на NSString (хотя значения NSStrings, они на самом деле просто целые числа).

Например, рассмотрим следующие отображения:

"dog" --> "4"
"cat" --> "3"
"turtle" --> "6"

Я бы хотел получить 10 лучших записей в словаре, отсортированных по убыванию значения. Может кто-нибудь показать мне код для этого? Возможно, существует массив ключей и другой массив значений. Тем не менее, я не против. Я просто пытаюсь сделать так, чтобы это было эффективно.

Спасибо!

Ответы [ 6 ]

46 голосов
/ 30 декабря 2010

Получить массив значений, отсортировать этот массив и затем получить ключ, соответствующий значению.

Вы можете получить значения с помощью:

NSArray* values = [myDict allValues];
NSArray* sortedValues = [values sortedArrayUsingSelector:@selector(comparator)];

Но, если коллекциякак вы показываете в своем примере (я имею в виду, вы можете вывести значение из ключа), вы всегда можете отсортировать ключи, а не связываться со значениями.* Компаратор - это селектор сообщений, который отправляется объекту, который вы хотите заказать.

Если вы хотите упорядочить строки, вам следует использовать компаратор NSString.Компараторы NSString: caseInsensitiveCompare или localizedCaseInsensitiveCompare.)

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;
}
4 голосов
/ 01 июня 2013

Используйте этот метод:

- (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];
}
4 голосов
/ 27 февраля 2012

Самый простой способ:

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 голосов
/ 01 марта 2012

Сортировка ключей и использование их для заполнения массива значениями:

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];
}
0 голосов
/ 14 апреля 2017

, если вы хотите отсортировать данные в порядке возрастания по ключу 'name' для такого типа примера, тогда это может помочь вам.

arrayAnimalList = [{'name' = Dog, '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];
0 голосов
/ 18 ноября 2011
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest"  ascending:YES];
[unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
recentSortedArray = [stories copy];
...