【问题标题】:How to do something with every second object in a NSArray? (iPhone)如何对 NSArray 中的每个第二个对象做一些事情? (苹果手机)
【发布时间】:2011-07-15 21:58:29
【问题描述】:

我有一个包含许多 NSDictionaries 的 NSArray。我正在使用for 循环遍历它:

for (int i = 0; i < [myArray count]; i++) {

 }

现在我想对数组的每个第二个对象做一些事情。假设数组的 count 为 5。它会对第 2 个、第 4 个和第 5 个对象执行一些操作。

我该怎么做?

for (int i = 0; i < [myArray count]; i++) {
           if //check if it is the second object 
     }

编辑:每隔一个对象和最后一个对象(如果有的话)..

【问题讨论】:

  • 你的意思是说每一秒最后一个?因为根据定义,“每秒”不包括第五个。
  • @yan 是的,每一秒,如果一个对象也仍然如此,

标签: iphone object loops for-loop nsarray


【解决方案1】:

您可以在循环增量期间增加 2 或在访问时乘以 2。

即:

for (int i = 0; i < [myArray count]; i += 2) {
  doStuff([myArray objectAtIndex:i]);
}

for (int i = 0; i < [myArray count]/2; i++) {
   doStuff([myArray objectAtIndex:i*2]);
}

【讨论】:

  • 但在第一种方法中:它不会因为“索引越界”而崩溃吗?
  • 否,因为 for 循环的测试部分仍然需要为真才能执行循环。设置循环的方式是,如果正在执行主体,i &lt; [myArray count] 将始终为真。也就是说,测试发生在循环执行之前,增量发生在之后。
【解决方案2】:

如果不需要索引,最好使用fast enumeration

BOOL odd = YES; 
for (id obj in ary) {
    odd = !odd;
    if (odd) continue;
    // do stuff
}

odd被初始化时,在循环之前,考虑隐式索引(传统for循环中的i)为-1。 (这是一个奇数。)在循环的第一次迭代中,索引递增为 0,odd 标志翻转为偶数 (NO)。该标志并不奇怪,因此我们运行此迭代(索引 0,第一个元素)。下一次迭代将索引增加到 1(第二个元素),并且标志反转为奇数。由于标志是奇数,我们跳过此迭代。像这样继续执行,直到数组结束。

编辑:如果您总是想对最后一个元素进行操作,那么带有索引的传统 for 循环会更简洁。为此,您需要手动跟踪索引或在循环后重复循环内容。

【讨论】:

  • 你能解释一下吗?我真的不明白你在做什么。
  • @cocos2dbeginner 我为我的问题添加了一些解释。不过,对于像这样微不足道的事情,使用哪种方法并不重要。使用你最清楚的那个。
【解决方案3】:

使用模运算符:

if (i % 2 || (i == [myArray count] - 1)) {
    // do stuff
}

模返回 i/2 除法的余数。
因此,如果 i 为 0(第一项),则为 0(==false)。
如果 i 为 1(第二项),则为 1(==true)。

为了获得你的最后一个元素,我添加了(i == [myArray count] - 1) 条件。

【讨论】:

  • 这是做什么的?能稍微解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2015-12-14
相关资源
最近更新 更多