0

如何正确比较从 NSArray 检索的字符串与文字字符串?到目前为止,我已经在一个方法中用三个空格“”填充了一个 NSArray,现在我试图用字符串“C10”替换 NSArray 中的 10 个随机索引,但我不想替换那里的内容除非它仍然是“”。

在这里,我创建了大小为 100 的数组,并用 3 个空格填充每个点。

-(void) initBoard{
    _board = [board initWithCapacity: 100];
    for(int i =0; i < 100; i++){
        [_board addObject:@"   "];
    }
}

这是我在相等比较时遇到问题的方法。

-(void)makeChutes: (int) numOfChutes {
    //Make argument number of Chutes randomly across the board.
    for(int i = 0; i < numOfChutes || i>(-100);){
        int random = arc4random_uniform(101);
        if ([[_board objectAtIndex:random] isEqual:@"   "]) {
            NSString *fString = [NSString stringWithFormat:@"C%d", 10];
            [_board replaceObjectAtIndex:random withObject:fString];
            i++;//Only increments i if 3 blank spaces were at random index..
        }
        else{//Used to attempt to stop my accidental infinite loop.
            i--;
            NSLog(@"I, loop, ran %i times.", i);//Attempt failed:-(
        }
    }
}

我知道上面的代码是一团糟。为了停止循环,我每次不满足 for 条件时都将 i 递减,然后使用 || 在我的 for 循环中添加一个 OR 条件,以尝试在 100 个循环后停止它。出于某种原因 || 即使 i 在 -100 以南,条件也不会阻止它循环。

我的第一个问题是如何正确地将存储在索引“随机”的数组中的字符串与 3 个空格的文字字符串进行比较?我也尝试了该方法isEqualToString,但效果相同。

其次也是不太重要的,因为我现在不需要它,我如何正确编写双条件 for 循环?我的 for 循环语法没有从 Xcode 收到任何错误或警告,它可以编译并运行,所以我真的不明白为什么它会忽略我的第二个条件并且即使在iis时也会继续迭代< -100

4

3 回答 3

1

使用此方法进行字符串比较

   [[_board objectAtIndex:random] isEqualToString:@"  "]

修改了你的代码。我想这就是你要找的

-(void)makeChutes: (int) numOfChutes
{
    for(int i = 0; i < numOfChutes ;i++){
        int random = arc4random_uniform(101);
        if ([[_board objectAtIndex:random] isEqualToString:@"  "])
        {
            [_board replaceObjectAtIndex:random withObject:@"C10"];
            i++;
        }
    }
}

编辑:您在评论中所说的解决方案

-(void)makeChutes: (int) numOfChutes
{
    int i=0;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] '  '"];
    NSArray *filteredArray = [_board filteredArrayUsingPredicate:predicate];
    int arrayCount=[filteredArray count];

    do {
        int random = arc4random_uniform(101);
        if ([[_board objectAtIndex:random] isEqualToString:@"  "])
        {
            [_board replaceObjectAtIndex:random withObject:@"C10"];
            i++;
            if (arrayCount == i) {
                i=numOfChutes;
            }
        }

    } while (i<numOfChutes);
 }

文档编辑

isEqualToString:返回一个布尔值,指示给定字符串是否等于使用基于文字的 Unicode 比较的接收者。

  • (BOOL)isEqualToString:(NSString *)aString 参数 aString 要与接收者进行比较的字符串。如果 aString 与接收者等效(如果它们具有相同的 id 或者在文字比较中它们是 NSOrderedSame),则返回值 YES,否则为 NO。

讨论 比较使用字符串的规范表示,对于特定字符串,它是字符串的长度加上构成字符串的 Unicode 字符。当此方法比较两个字符串时,如果各个 Unicode 相同,则无论后备存储如何,这些字符串都是相等的。“字面量”应用于字符串比较时,表示不应用各种 Unicode 分解规则,单独比较 Unicode 字符。因此,例如,表示为组合字符序列“O”和变音符号的“Ö”不会与表示为一个 Unicode 字符的“Ö”比较。

于 2013-02-25T05:25:25.327 回答
1

要知道它的存在与否以及它的索引,只需使用ContainsObject属性NSArray

[array containsObject:@"text"];
int indexOfObject = [array indexOfObject:@"text"];
于 2013-02-26T06:24:58.107 回答
0

我的“initBoard”方法坏了,导致“makeChutes”方法不能按预期工作。这是正确的initBoard:

-(void) initBoard{
    _board = [[NSMutableArray alloc] initWithCapacity:100];
    for(int i =0; i < 100; i++){
        [_board addObject:@"   "];
    }
}

以及更正后的 makeChutes:

-(void)makeChutes: (int) numOfChutes{
    //Make argument number of Chutes randomly across the board.
    for(int i = 0; i < numOfChutes;){
        int random = arc4random_uniform(100);//+1 of max index
        if ([[_board objectAtIndex:random] isEqualTo:@"   "]){
            NSString *fString = [NSString stringWithFormat:@"C%d", 10];
            [_board replaceObjectAtIndex:random withObject:fString];
            i++;//Only increments i if 3 blank spaces were at random index.
        }
    }
}
于 2013-03-07T17:22:57.407 回答