如何在 Objective-C 中从集合的末尾而不是从头开始实现 for-in 循环



我正在尝试通过 for in 循环迭代 NSDictionary。但我希望它从这个集合的末尾开始迭代到它的开始。如何实现此还原?

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

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

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

嗯......问题是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]);
}

日志是:

  • 第三值
  • 第二值
  • 第一值
  • 第一值
  • 第二值
  • 第三值
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];

最新更新