0

解決するのは簡単なことのように思えますが、これまでのところ、簡単な解決策は思いつきませんでした。

次のようないくつかの文字列を含む NSArray があります。

NSArray *items = [NSArray arrayWithObjects:@"page_standard", @"google_map_location", @"comment", @"folder", nil];

提供されている検索用語がありますが、形式が少し異なります。

NSString *searchTerm = @"Standard Page Format";

別の用語は次のとおりです。

NSString *searchTerm = @"Location Google Map";

したがって、 mysearchTermは配列内の文字列とは異なる形式になっていpage_standardますが、それでも一致させ、一致のインデックスを返すことができるようにしたいと考えています。

注:これは、ユーザーが編集可能な検索ではありません。むしろ、これらはそれらのコードの「コード」と「わかりやすい名前」です。「フレンドリ名」が一致する「コード」を見つけることができるように、2 つを一致させる必要があります。

これは可能ですか?

4

5 に答える 5

1

一連の用語が事前にわかっていて、ユーザーが自由形式のテキスト エントリではなくリストから選択する場合は、「わかりやすい」用語を内部用語にマップする辞書を作成するだけです。

NSDictionary *internalTermForFriendlyTerm = @{
    @"Standard Page Format": @"page_standard",
    @"Location Google Map": @"google_map_location",
    // etc.
};

...

NSString *internalTerm = internalTermForFriendlyTerm[searchTerm];

実行時に簡単に更新できるように、ディクショナリをプロパティ リスト ファイルに格納できます。

于 2012-11-21T20:02:33.843 に答える
0

次のことを試してください。

- (NSString*)find:(NSString*)term in:(NSArray*)terms {
  for (NSString *item in terms) {
    NSMutableSet *dictSet = [NSMutableSet set];
    for (NSString *word in [item componentsSeparatedByString:@"_"]) {
      [dictSet addObject:[word lowercaseString]];
    }
    NSMutableSet *testSet = [NSMutableSet set];
    for (NSString *word in [term componentsSeparatedByString:@" "]) {
      [testSet addObject:[word lowercaseString]];
    }
    if ([dictSet isEqualToSet:testSet]) {
      return item;
    }
  }
  return nil;
}
于 2012-11-21T20:03:18.673 に答える
0

コンピュータは、わずかに異なる 2 つの文字列を区別することはできません。ここでの意味は、「類似した文字列」を見つけることです。
この場合、 rangeOfString メソッドがうまく機能します。

「google_map_location」の場合、「Location」、「Google」、「Map」の文字列はすべて「google_map_location」の部分文字列です。
あなたの場所では、「類似の文字列」を検索するメソッドを使用してカテゴリを作成します。最初にスペース文字を区切り文字として使用して文字列をトークンに分割し、次に、たとえば文字列が類似している場合などの基準を確立します。単語は文字列の部分文字列であり、大文字と小文字を区別しない比較も行われます。

于 2012-11-21T20:08:37.853 に答える
0

あなたの問題に対する正確な解決策ではありません。しかし、これらの線に沿った何かがうまくいくはずです。

  1. セパレーター「 」と「_」に基づいて配列内の単語を区切り、すべての単語を小文字に変換します。
  2. これらの配列のセットを から作成された配列と比較しますsearchTerm。何かのようなもの、

試す、

NSMutableSet *set1 = [NSMutableSet setWithArray:originalFirstWordArray];
NSMutableSet *set2 = [NSMutableSet setWithArray:searchTermArray];
[set1 intersectSet:set2];

NSArray *result = [set1 allObjects];

配列の数に基づいて、results一致するかどうかを判断できます。基本的には比較する必要があるかもしれませんsearchTermArray

更新:最後の編集に基づいて、これらのキーワードをキーと値のペアとして plist に保存し、必要に応じて比較するだけでよいと思います。上記の回答は、検索がユーザーが編集可能な検索である場合に適しています。

于 2012-11-21T20:02:21.580 に答える
0

単純な解決策は、文字列を " " と "_" で区切られた小文字の単語のセットに分割し、交差が最大のセットを選択することです。これにより、実際のユーザー向けの検索機能用にさらに絞り込みたいと思うかもしれませんが、テスト ケースに十分近づけることができます (たとえば、ユーザーは「標準」の代わりに「通常」と書くか、「loc」が必要になる場合があります)。場所を見つけるため)。

編集:あなたのコメントに基づいて、これはすべてユーザー向けではなく内部のようです。その場合、最も簡単な解決策は、「わかりやすい名前」をキーとして、「コード」を対応する値として辞書にすべて貼り付けることです。このようにすると、あいまいさがなくなり、「わかりやすい名前」を自由に設定できます。

于 2012-11-21T19:54:34.803 に答える