3

全て、

述語を使用して検索結果を返そうとしています。検索文字列VSで始まる文字列が優先されます。単にその中に含まれています。

たとえば、検索文字列が「Objective-C」の場合、次のようにフィルタリングされた結果を取得します。

Objective-C入門書
Objective-Cパターン
Objective-CプログラミングObjective-C
のすべてObjective-Cでプログラミング
する方法

これが私が試したものですが、それはORであるため、明らかに最初の条件を優先しません。述語で一種の「連鎖」を行う方法はありますか?ありがとう

  NSPredicate *filter = [NSPredicate predicateWithFormat:@"subject BEGINSWITH [cd] %@ OR subject CONTAINS [cd]", searchText,searchText];
  NSArray *filtered = [myArray filteredArrayUsingPredicate: filter];
4

2 に答える 2

1

NSPredicateだけでやる方法はないと思います。あなたが求めているように見えるのは、ソートされた結果です。これを行うには、述語から結果を取得した後で結果を並べ替えます。この場合、ソート順は単にアルファベット順ではないため、NSArrayの-sortedArrayUsingComparator:メソッドを使用する必要があります。このようなもの(テストされていない、頭のてっぺんからタイプされた)。

NSArray *sortedStrings = [filtered sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *string1 = (NSString *)obj1;
    NSString *string2 = (NSString *)obj2;
    NSUInteger searchStringLocation1 = [string1 rangeOfString:searchString].location;
    NSUInteger searchStringLocation2 = [string2 rangeOfString:searchString].location;
    if (searchStringLocation1 < searchStringLocation2) return NSOrderedDescending;
    if (searchStringLocation1 > searchStringLocation2) return NSOrderedAscending;
    return NSOrderedSame;
}];
于 2012-04-06T17:13:39.207 に答える
1

述語を使用して配列を並べ替えようとしているようです。または、述語だけを使用してフィルターと並べ替えを試みているようです。述語はブール値を返します。文字列が検索テキストで始まるか、検索テキストを含むか、含まないかのいずれかです。述語は相対的な順序について何も教えてくれません。配列をフィルタリングすると、指定した述語がNOを返すオブジェクトが削除されるため、検索テキストで始まるオブジェクトまたは検索テキストを含むオブジェクトのみがフィルタリングされた配列に存在します。実際、検索テキストで始まる文字列にもそれが含まれているため、述語を「含む」の部分だけに簡略化できます。

フィルター処理された結果の順序を変更する場合は、フィルター処理された配列を適​​切なコンパレーターでソートします。

于 2012-04-06T17:14:48.850 に答える