for(i=0;i<number;i++) 循环行为未按预期工作?

Posted

技术标签:

【中文标题】for(i=0;i<number;i++) 循环行为未按预期工作?【英文标题】:for(i=0;i<number;i++) loop behavior not working as expected? 【发布时间】:2013-09-11 01:02:38 【问题描述】:

下面的代码应该执行此操作:无论当前运动员在哪里,当您点击下一步按钮时,都会执行下面的代码。它应该将当前运动员更改为数组中的下一个运动员,然后当它到达最后一个人时,它需要循环回 0(第一个对象)。它确实做到了这一点。当我到达数组的末尾时,它会再次转到第一个人,这是正确的,但从那时起将跳过数组中的最后一个对象。知道为什么吗?

 -(void)nextAthlete

    NSUInteger index = [_athleteArray indexOfObject:_currentAthlete];

    Athlete *count = _athleteArray[index];

    NSLog(@"Current Athlete:%@ Index: %lu",count,(unsigned long)index);

    if(index < ((_athleteArray.count)-1))
        index++;
        _currentAthlete = _athleteArray[index];
        _evalSelected = [self getMostRecentEval];
        [self updateInformation];
        NSLog(@"Index after being smaller than the array count: %lu",(unsigned long)index);
    
    if(index == ((_athleteArray.count)-1))
        _currentAthlete = _athleteArray[index];
            _evalSelected = [self getMostRecentEval];
            [self updateInformation];
        index=0;
        _currentAthlete = _athleteArray[index];
            NSLog(@"Index after being equal to array count: %lu",(unsigned long)index);
    
    if(index > ((_athleteArray.count)-1))
        index=0;
        _currentAthlete = _athleteArray[index];
    
    self.title = [NSString stringWithFormat:@"%@'s Evaluation",_evalSelected.whosEval.full];



【问题讨论】:

当您设置index=0 时,您需要执行其他任何操作之前执行此操作。目前index == _athleteArray.count时,在更新索引之前访问数组,导致越界访问。 @Mac:我不想要索引为零。它需要从当前运动员所在的位置开始。例如如果我从 5 位中的第 3 位运动员开始,它需要转到 4,然后是 5,然后是 0。 index 是在循环内部还是外部声明? @CarlVeazey:index 在循环之外 @JosueEspinosa 嗯...在声明 index 的方法中没有循环,因此您的声明与您的代码相矛盾 - 但我想我明白发生了什么。你在做for (int i = 0; i &lt; [_athleteArray count]; i++) [self nextAthlete]; 之类的事情吗? 【参考方案1】:

您不需要所有这些if 语句。您将 nextIndex 与模运算符包装在一起,因此您不需要应用所有其他逻辑 - 将 index 设置为 nextIndex 就足够了。此外,由于它们不是 if..else 语句,因此在数组中倒数第二项的情况下,您将多次递增和包装索引。当第二个 if 块执行时,第三个也会执行,所以_currentAthlete 在这种情况下会跳过最后一项。

无论如何,无需重复所有逻辑 - 让您的代码如下所示:

NSUInteger nextIndex = (index + 1) % _athleteArray.count;

Athlete *count = _athleteArray[index];
NSLog(@"Current Athlete:%@ Index: %lu",count,(unsigned long)index);
index=nextIndex;
_currentAthlete = _athleteArray[index];
_evalSelected = [self getMostRecentEval];
[self updateInformation];
self.title = [NSString stringWithFormat:@"%@'s Evaluation",_evalSelected.whosEval.full];

不过,这有点奇怪,因为您跳过了_selectedAthlete 的第一个值。但我想你会在循环的最后一次迭代中回到它。

【讨论】:

是的。谢谢,我没有想到,因为我最初使用的是 index++,所以我只是替换了。谢谢,就像一个魅力! 是的,没问题。在调试器中逐行执行类似这样的操作总是一个好主意,因为您会发现_currentAthlete 的双倍递增,这可能比我通过阅读代码发现的要快得多!【参考方案2】:

从您的评论“如果我从 5 中的第 3 位的运动员开始,它需要转到 4,然后是 5,然后是 0”,听起来您希望前进到下一个索引,将数组视为循环。为此,您可以使用模运算符%,对于正数,它是余数

NSUInteger index = [_athleteArray indexOfObject:_currentAthlete];
NSUInteger nextIndex = (index + 1) % _athleteArray.count;

在您的情况下,您有 4 名运动员,因此 index 将在 0 -> 3 的范围内。 因此(index + 1) 在 1 -> 4 的范围内。 除以 4 后取 余数 分别得到 1、2、3、0。 所以nextIndex是循环方式的“跟随”索引。

【讨论】:

【参考方案3】:
if(index < _athleteArray.count) 

需要

if(index < _athleteArray.count - 1).

想一想——如果你的数组中有 4 个运动员,那么当 index = 3 时,你将输入 if 子句并将 index 增加到 4。

当你执行 _currentAthlete = _athleteArray[index] index = 4,你会得到错误。

【讨论】:

您先生,真是个天才。谢谢你,我会在计时结束后接受你的回答。 对不起,它不再崩溃了,但它仍然不会超过最后一个人,当我点击下一个时它只是停留。我用额外的 count-1 更改了所有 if 语句。知道为什么会这样吗? @JosueEspinosa,在显示最后一个运动员后,您希望它做什么?拿到第一个了吗? 应该做到以下几点:0,1,2[继续加1],lastObject,0,1,2,....,lastObject...

以上是关于for(i=0;i<number;i++) 循环行为未按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章

数组冒泡排序算法解析

137. Single Number II

for+if语句 和 仅用if语句 的程序效率

数组排序

LeetCode 268. Missing Number

哪个“for”循环具有更好的时间复杂度?