0

NSMutable配列にバンドルしている文字列のpListがあります。

NSString *path = [[NSBundle mainBundle] pathForResource:@"small" ofType:@"plist"];
_availableWords = [[NSMutableArray alloc]initWithContentsOfFile:path];

文字列内の各文字を指定された文字と比較し、その結果を使用して新しい配列を作成したいと思います。

以下を使用して、最初と最後の文字をフィルタリングできます

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF beginswith[cd] %@", @"B"];

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF endswith[cd] %@", @"B"];

しかし、characterAtIndexメソッドを使用して間にある文字をチェックしようとすると、エラーが発生します。

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF characterAtIndex:%i LIKE[cd] %@", 3, @"B"];

文字をチェックする各単語をループするループを実行できる可能性があることはわかっていますが、NSPredicateの使用は非常に整理されており、文字列のリストが非常に大きくなる可能性があることを考えると、パフォーマンスが大幅に向上するはずです(100,000以上)。

NSPredicateでcharacterAtIndexを使用するための適切な構文を教えてもらえますか、または他のソリューションのアイデアがありますか?

更新:以下のKensの回答に基づいて、以下のコードを使用して、最初と最後の文字以外の文字をチェックしています。たとえば、以下は4番目の文字をチェックします。

NSArray *matches = [_availableWords objectsAtIndexes:[_availableWords indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    return (BOOL)([obj characterAtIndex:3] == 'R');
}]];

ただし、デバッガーで一致配列を検査すると、次のエラーが表示されます。

matches NSArray *   0x06a67ba0 @"Variable is not a CFArray"

配列にオブジェクトはありません。short.pListのサンプルデータに基づいて、配列内に1つのオブジェクトが表示されると思います。

助けてくれてありがとう、ダーム

4

1 に答える 1

4

組み込み述語はそのような操作をサポートしていません。ただし、ブロックを評価する述語を作成できます。

NSPredicate* filter = [NSPredicate predicateWithBlock:^(id evaluatedObject, NSDictionary *bindings){
    return (BOOL)([evaluatedObject characterAtIndex:3] == 'B');
}];

または、この述語で配列を振り返ってフィルタリングする場合は、仲介者を切り取り、ブロックを使用して配列の要素を直接識別することができます。

NSArray* matches = [array objectsAtIndexes:[array indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    return (BOOL)([obj characterAtIndex:3] == 'B');
}]];
于 2012-04-15T19:54:08.507 に答える