对NSMutableDictionary进行排序

时间:2010-12-29 23:03:00

标签: ios dictionary nsmutabledictionary

我有NSMutableDictionaryNSString映射到NSString(尽管值为NSStrings,但它们实际上只是整数)。

例如,考虑以下映射,

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

我希望最终得到字典中的前10个条目,按值的递减顺序排序。有人可以给我看这个代码吗?也许有一组键和另一组值。不管怎样,我不介意。我只是想让它变得高效。

谢谢!

6 个答案:

答案 0 :(得分:46)

获取值数组,对该数组进行排序,然后获取与该值对应的键。

您可以使用以下内容获取值:

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

但是,如果集合与您在示例中显示的一样,(我的意思是,您可以从键中推断出值),您可以随时对键进行排序,而不是弄乱值。

使用:

NSArray* sortedKeys = [myDict keysSortedByValueUsingSelector:@selector(comparator)];

比较器是一个消息选择器,它被发送到您想要订购的对象。

如果要订购字符串,则应使用NSString比较器。 NSString比较器是:caseInsensitiveCompare或localizedCaseInsensitiveCompare:。

如果这些都不适合您,您可以调用自己的比较器功能

[values sortedArrayUsingFunction:comparatorFunction context:nil]

作为comparatorFunction(来自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;
}

答案 1 :(得分:4)

最简单的方法是:

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];
        }
    }
}

答案 2 :(得分: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];
}

答案 3 :(得分: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 :(得分:0)

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest"  ascending:YES];
[unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
recentSortedArray = [stories copy];

答案 5 :(得分:0)

如果你想按照这种类型的例子的关键'名称'按升序对数据进行排序,那么这可能对你有帮助。

  

arrayAnimalList = [                                  {                                      'name'=狗,                                      'animal_id'= 001                                  },                                  {                                      'name'=老鼠,                                      'animal_id'= 002                                  },                                  {                                      'name'=猫,                                      '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];