【问题标题】:Is there an easy way to iterate over an NSArray backwards?有没有一种简单的方法可以向后迭代 NSArray?
【发布时间】:2010-10-25 01:22:52
【问题描述】:

我有一个 NSArray 并且必须在特殊情况下向后迭代它,以便我首先查看最后一个元素。这是出于性能原因:如果最后一个没有意义,则可以忽略所有以前的。所以我想打破循环。但是,如果我从 0 向前迭代到 n,那将不起作用。我需要从 n 到 0。也许有一个我不知道的方法或函数,所以我不必在这里重新发明轮子。

【问题讨论】:

标签: objective-c nsarray


【解决方案1】:

要添加其他答案,您可以将 -[NSArray reverseObjectEnumerator] 与 Objective-C 2.0(Leopard、iPhone 中可用)中的快速枚举功能结合使用:

for (id someObject in [myArray reverseObjectEnumerator])
{
    // print some info
    NSLog([someObject description]);
}

更多信息来源:http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

【讨论】:

  • 这是否被认为是快速枚举,这是否比从[myArray count]-1 开始的常规 c for 循环更快?如何向后迭代 NSString
  • 我现在没有任何链接,但在某处(可能是 WWDC)有一段视频,其中一位 Apple 工程师解释了枚举的工作原理以及它为何如此之快。它的性能优于基于索引的 NSArray 枚举和经典的 Foundation 枚举器,并且根据场景的不同,它的性能要好很多。
  • 我必须在字典上运行反向 for 循环,该怎么做?
  • @AshwinG 你的问题没有意义,因为NSDictionarys 没有“订单”。您可以按任何实际顺序枚举它们,除非您首先对键/值进行排序。
【解决方案2】:

由于这是为了提高性能,您有多种选择,建议您全部尝试一下,看看哪种效果最好。

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Create a reverse copy of the array 然后正常迭代
  • 使用标准 C for 循环并开始并向后遍历数组。

更极端的方法(如果性能非常关键)

  • 了解 Cocoa 如何实现快速对象枚举并反向创建您自己的等价物。
  • 使用 C 或 C++ 数组。

可能还有其他人。在这种情况下,任何人都可以随意添加。

【讨论】:

  • 我会说 enumerateObjectsWithOptions:NSEnumerationReverse 是最好的答案,特别是如果你需要知道你在什么索引上。谢谢!!!
【解决方案3】:

来自here

 NSEnumerator* myIterator = [myArray reverseObjectEnumerator];
 id anObject;

 while( anObject = [myIterator nextObject])
 {
     /* do something useful with anObject */
 }

【讨论】:

    【解决方案4】:
    [NsArray reverseObjectEnumerator]
    

    【讨论】:

      【解决方案5】:
      for (int i = ((int)[array count] - 1); i > -1; i--) {
          NSLog(@"element: %@",array[i]);
      }
      

      【讨论】:

      • 这不会在枚举(元素、计数)期间检测到对可变数组实例的更改。否则可能比创建 NSEnumerator 对象快一点。
      猜你喜欢
      • 2020-03-18
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多