0

私はObjective-Cの初心者ですが、配列をループして、部分文字列がそこにあるかどうかを確認したいと思います。trueの場合、配列のオブジェクトは、画面に配置される他の配列に配置する必要があります。これは私のコードです:

NSArray *origarray = [NSArray arrayWithObjects:
                 @"One",
                 @"Two",
                 @"Three",
                 @"Four",
                 @"Five",nil];
for(NSString *words in origarray){
    NSMutableArray *newarray = [[NSMutableArray alloc] init];
    NSRange range = [words rangeOfString:@"o"];
    if(range.location != NSNotFound){
        [newarray addObject:words];
    }
    textview.text = [newarray description];
}

この場合、両方に「o」が含まれているため、「One」、「Two」、および「Four」の配列を取得する必要があります。残念ながら、テキストビューに空の配列が表示されます。(「説明」はデバッグ目的のみであることがわかっています)。これを正しく行う方法を教えてくれる人はいますか?

4

2 に答える 2

3

NSPredicateたとえば、それを行うために使用できます

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains %@", @"o"];
NSArray* newArray = [origarray filteredArrayUsingPredicate:predicate];

また

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", @"o"];
NSArray* newArray = [origarray filteredArrayUsingPredicate:predicate];

大文字と小文字を区別しないマッチングの場合

于 2012-06-20T14:12:29.190 に答える
1

空の配列を取得する理由は、反復するたびに配列を再割り当てするためです。代わりにこれを試してください(ループの前に配列の割り当てを配置したので、一度実行され、テキストビューも更新されます):

NSArray *origarray = [NSArray arrayWithObjects:
             @"One",
             @"Two",
             @"Three",
             @"Four",
             @"Five",nil];

NSMutableArray *newarray = [[NSMutableArray alloc] init];

for(NSString *words in origarray){
    NSRange range = [words rangeOfString:@"o"];
    if(range.location != NSNotFound){
        [newarray addObject:words];
    }
}

textview.text = [newarray description];

編集:@Alladinianは、rangeOfString:が大文字と小文字を区別して検索するという優れた点を示しています。大文字と小文字を区別しないようにする場合は、次を変更する必要があります。

NSRange range = [words rangeOfString:@"o"];

NSRange range = [words rangeOfString:@"o" options:NSCaseInsensitiveSearch];
于 2012-06-20T14:06:12.873 に答える