在Value AND Key上对NSMutableDictionary进行排序?

时间:2012-06-02 23:08:31

标签: objective-c ios nsarray nsmutabledictionary

我首先尝试按值排序NSMutableDictionary,然后按键排序。我按以下代码使用值排序:

       NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
        [dict setObject:[NSNumber numberWithInt:5] forKey:@"eblk"];
        [dict setObject:[NSNumber numberWithInt:2] forKey:@"dstl"];
        [dict setObject:[NSNumber numberWithInt:4] forKey:@"cast"];
        [dict setObject:[NSNumber numberWithInt:4] forKey:@"breb"];
        [dict setObject:[NSNumber numberWithInt:5] forKey:@"apts"];

         NSArray *sortedKeys = [dict keysSortedByValueUsingComparator: ^(id obj1, id obj2) 
        {
          if ([obj1 integerValue] < [obj2 integerValue]) {
              return (NSComparisonResult)NSOrderedDescending;
          }
          if ([obj1 integerValue] > [obj2 integerValue]) {
              return (NSComparisonResult)NSOrderedAscending;
          }
          return (NSComparisonResult)NSOrderedSame;
        }];

然后我想基于键再次排序,所以我最终得到了一个像这样的键数组:

sortedKeys:dict中的对应值

“apts”:5

“eblk”:5

“breb”:4

“cast”:4

“dstl”:2

我有第一种关于价值工作的方法,我只是不确定如何开始基于密钥的二级排序。

我尝试先按键然后按值排序,但这不起作用。

任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:3)

你要做的是两个关键的排序。对于任何n键排序,您按顺序比较键,如果当前对不相等则返回结果,否则移动到下一对键并重复。

两个键的大纲草图:

  1. 获取一系列密钥,以便对其进行排序
  2. 使用两键排序对该数组进行排序:

    • 通过查找来获取值
    • 比较值并返回(如果不相等)
    • 比较键;
  3. 代码草图:

    NSArray *allKeys = [dict allKeys];
    NSArray *sortedKeys = [allKeys sortedArrayUsingComparator:^(id obj1, id obj2)
    {
       NSInteger value1 = [[dict objectForKey:obj1] integerValue];
       NSInteger value2 = [[dict objectForKey:obj2] integerValue];
    
       if (value1 < value2) 
          return (NSComparisonResult)NSOrderedDescending;
       if (value1 > value2) 
          return (NSComparisonResult)NSOrderedAscending;
       // values are equal, compare keys...         
       return [obj1 compare:obj2];
    }];