0

NSArray から取得している文字列をリテラル文字列と正しく比較するにはどうすればよいですか? これまでのところ、1 つの方法で NSArray を 3 つの空白スペース " " で埋めました。現在、NSArray 内の 10 個のランダム インデックスを文字列 "C10" に置き換えようとしていますが、そこにあるものを置き換えたくありません。まだ " " でない限り。

ここでは、サイズ 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 よりかなり南にある場合でも、条件によってループが停止されることはありません。

私の最初の質問は、インデックス「random」で配列に格納されている文字列を、3 つの空白のリテラル文字列と適切に比較するにはどうすればよいかということです。方法も試しましたisEqualToStringが、同じように機能しました。

次に、あまり重要ではありませんが、今は必要ないので、二重条件の for ループを適切にコーディングするにはどうすればよいでしょうか? ifor ループ構文を使用すると、Xcode からエラーや警告が表示されず、コンパイルして実行されるため、2 番目の条件を無視して、 isの間でも反復し続ける理由がよくわかりません< -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);
 }

DOCS から編集

isEqualToString:リテラルUnicodeベースの比較を使用して、指定された文字列がレシーバーと等しいかどうかを示すブール値を返します。

  • (BOOL)isEqualToString:(NSString *)aStringパラメーターaStringレシーバーを比較するための文字列。aStringがレシーバーと同等である場合(同じIDを持っている場合、またはリテラル比較でNSOrderedSameである場合)、戻り値YES、それ以外の場合はNO。

考察比較では、文字列の正規表現を使用します。これは、特定の文字列の場合、文字列の長さに文字列を構成するUnicode文字を加えたものです。このメソッドが2つの文字列を比較する場合、個々のUnicodeが同じであれば、バッキングストアに関係なく、文字列は等しくなります。文字列比較に適用される場合の「リテラル」は、さまざまなUnicode分解ルールが適用されず、Unicode文字が個別に比較されることを意味します。したがって、たとえば、合成文字シーケンス「O」として表される「Ö」とumlautは、1つの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 に答える