如何正确地将我从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
时仍然继续迭代}。
答案 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.
}
}
}