Objective-C将NSArray中的字符串对象与字符串进行比较以进行相等

时间:2013-02-25 05:18:21

标签: objective-c xcode

如何正确地将我从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个循环后停止它。出于某种原因||条件不会阻止它循环,即使我在-100以南。

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

其次,不太重要,因为我现在不需要它,我如何正确编码双条件for循环?我没有从我的for循环语法中获取Xcode的任何错误或警告,并且它编译并运行,所以我真的不明白为什么它忽略了我的第二个条件并且在i < -100时仍然继续迭代}。

3 个答案:

答案 0 :(得分: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);
 }

快乐编码:)

修改 来自DOCS

  

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

     
      
  • (BOOL)isEqualToString:(NSString *)aString参数aString用于比较接收器的字符串。返回值如果是aString,则返回YES   相当于接收者(如果他们有相同的ID或如果他们是   NSOrderedSame在字面比较中),否则为NO。
  •   
     

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

答案 1 :(得分:1)

知道是否存在及其索引仅使用ContainsObject上的NSArray属性

[array containsObject:@"text"];
int indexOfObject = [array indexOfObject:@"text"];

答案 2 :(得分: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.
        }
    }
}