如何从集合结束而不是从头开始在Objective-C中实现for-in循环?

Mai*_*r00 1 objective-c for-in-loop ios

我试图通过for循环迭代NSDictionary.但我希望它从这个集合的结尾开始迭代到它的开始.我该如何实现这种回归?

Ala*_*lan 7

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

当您在foreach循环中调用NSDictionary时,您将迭代无序的键列表.在迭代无序列表时,订单未定义,因此正在颠倒顺序.它类似于在地板上散布一副牌,然后要求某人改变顺序.

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

  • 订单未定义,您不能指望Key集合中的最后一个键是插入NSDictionary的最后一个元素.如果您知道需要将标志设置为1的最后一条消息,您是否可以检查每条消息的来源,如果它的标志设置为1,那么将它存储在NSDictionary之外的其他人?这样,您始终可以使用`Flag = 1`快速访问最后一条消息 (2认同)

Ver*_*ig0 5

嗯......问题是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]);
}
Run Code Online (Sandbox Code Playgroud)

日志是:

  • thirdValue
  • secondValue
  • firstValue
  • firstValue
  • secondValue
  • thirdValue