1

UISearchDisplayControllerユーザーがテーブルを検索できるようにするを実装しました。現在、検索に使用している述語は次のとおりです。

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"Name contains[cd] %@", searchText];

ここで、ユーザーが「豆、調理済み」を検索すると、対応する一致がテーブルに見つかります。ただし、ユーザーが検索テキストを「beans Cooked」とカンマなしで入力した場合、一致するものは見つかりません。

検索時にコンマを「無視」するように述語を書き直すにはどうすればよいですか?言い換えれば、「調理された豆」が「調理された豆」(COMMMAなし)と等しくなるように書き直すにはどうすればよいですか?

4

3 に答える 3

2

最初の免責事項:

あなたがやろうとしているのは、検索アルゴリズムに「あいまいさ」を追加することだと思います.ユーザー入力の特定の違いに反応しないように一致させたいと考えています.

述語 (論理構成体) は、その性質上ファジーではないため、問題と選択したツールとの間に根本的なインピーダンスの不一致があります。

とにかく、それを行う 1 つの方法は、モデル オブジェクト クラスにメソッドを追加することです。

この方法では、名前の文字列を消去して、数字、ASCII 文字、スペースなどの最も基本的な文字のみを含めることができます。

完全に決定論的であるため、このようなメソッドは事実上、オブジェクトの読み取り専用の文字列プロパティであり、述語での照合に使用できます。

以下は、句読点、アクセント記号、分音符号を削除する実装です。

- (NSString *)simplifiedName
{
    // First convert the name string to a pure ASCII string
    NSData *asciiData = [self.name dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

    NSString *asciiString = [[[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding] lowercaseString];

    // Define the characters that we will allow in our simplified name
    NSString *searchCharacters = @"0123456789 abcdefghijklmnopqrstuvwxyz";

    // Remove anything else
    NSString *regExPattern = [NSString stringWithFormat:@"[^%@]", searchCharacters];

    NSString *simplifiedName = [asciiString stringByReplacingOccurrencesOfString:regExPattern withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, asciiString.length)];

    return simplifiedName;
}

ここで、簡略化された名前で検索する述語を作成できます。

NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.simplifiedName = %@", searchString];

もちろん、名前の消去に使用したのと同じアルゴリズムを使用して検索文字列を消去する必要があるため、両方の場所で使用される一般的な方法に分解することをお勧めします。

最後にsimplifiedName、モデル オブジェクト クラスにカテゴリを実装することによってメソッドを追加することもできるため、そのコードを変更する必要はありません。これは、Core Data によって自動生成されたファイルでオブジェクト クラスが定義されている場合に便利です。

于 2012-06-17T14:22:45.783 に答える
1

これは少しハッキーかもしれませんが、検索語からコンマを削除するだけで済みます。

例:

searchText = [searchText stringByReplacingOccurrencesOfString:@"," withString:@""];
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"Name contains[cd] %@", searchText];
于 2012-06-15T22:34:33.903 に答える
0

このタイプの問題に対して私が見つけた最良の解決策は、実際に各項目辞書に同じ名前のエントリを追加することですが、この回答のようにすべての句読点、コンマ、ダッシュなどを削除します

于 2012-06-16T17:45:05.713 に答える