1

我正在尝试通过 for in 循环迭代 NSDictionary。但我希望它从这个集合的末尾开始迭代到它的开头。我怎样才能实现这种回归?

4

3 回答 3

7

NSDictionary是无序的数据结构。没有前向迭代或后向迭代的概念。

当您在 foreach 循环中调用 NSDictionary 时,您正在迭代一个无序列表的键。迭代无序列表时,顺序未定义,因此颠倒顺序也是如此。这类似于将一副纸牌散落在地板上,然后要求某人颠倒顺序。

假设您的键有一些顺序层次结构(数字、字母等),您可以获取键集合,并将其排序为特定顺序,然后迭代键集合,或反向迭代。但是,如果这是您经常执行的操作,那么我怀疑这NSDictionary不是解决您的问题的数据结构的最佳选择。

于 2012-11-30T17:28:40.543 回答
6

嗯...问题是 NSDictionary 本质上是无序的。

因此,一个可能的解决方案是用键创建一个 NSArray,用“reverseObjectEnumerator”反转该数组,然后在数组上循环并使用字典上的键。

像这样的东西:

NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
                       @"firstValue",@"firstKey",
                       @"secondValue",@"secondKey",
                       @"thirdValue",@"thirdKey",
                       nil];

NSArray *keysNormal   = [_dict allKeys];
NSArray *keysReversed = [[[_dict allKeys] reverseObjectEnumerator] allObjects];

for(NSString *str in keysNormal)
{
    NSLog(@"%@", [_dict objectForKey:str]);
}

for(NSString *str in keysReversed)
{
    NSLog(@"%@", [_dict objectForKey:str]);
}

日志是:

  • 第三值
  • 秒值
  • 第一值
  • 第一值
  • 秒值
  • 第三值
于 2012-11-30T17:34:54.167 回答
1
NSArray * a = @[@"a",@"b",@"c"];
NSArray * b = [[a reverseObjectEnumerator] allObjects];
for (NSString * obj in b) {
    NSLog(@"%@",obj);
}

打印 c,b,a。尝试像这样反转字典的键:

NSArray * key = [[[dict allKeys] reverseObjectEnumerator] allObjects];
于 2012-11-30T17:29:06.220 回答