2つの文字列内の類似した文字の数を確認するための組み込みのメソッド(ドキュメントを検索しても見つかりません)はありますか?文字の順序は関係ないため、「abc」と「cad」を比較すると、文字「c」と「d」が66%一致します。発生数も関係します。「a」は最初は一致する必要がありますが、2つの文字列の間に共通の「a」が1つしかないため、2回目は一致しません。現在、ビット演算を使用してこれを行うための組み込みの方法はありますか、それともループして手動で比較する必要がありますか?
2 に答える
これは自分で作成する必要がありますが、これを行うためのショートカットを次に示します。という組み込みのコレクション クラスがありNSCountedSet
ます。このオブジェクトは、それぞれの一意のオブジェクトと、それぞれが追加された数のカウントを保持します。
2 つの文字列を取得して、それらの文字を 2 つの異なるNSCountedSet
コレクションに読み込むことができます。次に、結果のコレクション内のアイテムを確認します。たとえば、最初の からオブジェクトを取得しますNSCountedSet
。2 番目の に存在するかどうかを確認しますNSCountedSet
。その特定の文字の 2 つの数のうち小さい方が、2 つの文字列に共通する文字の数です。反復回数を短縮するには、オブジェクトの数が少ないコレクションから開始し、それらのオブジェクトを列挙します。
の Apple のドキュメントは次のとおりですNSCountedSet
。
https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSCountedSet_Class/Reference/Reference.html
言うのはためらいますが、おそらくあなたの要件を満たす方法は他にありません。私はこれをします:
NSString にカテゴリを作成します。呼びましょう-(float)percentageOfSimilarCharactersForString:(NSString*)targetString
このカテゴリに分類される大まかな疑似コードを次に示します。
- 固有の文字のみを含むように、selfCopy
self
という名前のコピーを作成します。selfCopy and trim
- 同様
targetString
に、固有の文字にトリムします。ユニークな文字にトリミングするには、NSSet
またはそのサブクラスを利用できます。各キャラクターをループしてセットに追加すると役立ちます。 - ここで、両方のセットを ASCII 値で並べ替えます。
- 関連する NSSetの各文字をループし、
targetString
関連する NSSet に存在するかどうかを確認しselfCopy
ます。このために、containsString という別のカテゴリを使用できます。ここで見つけることができます。containsString が true を返すたびに、事前定義されたカウンターをインクリメントします。 - 戻り値は になります
(counter_value/length_of_selfCopy)*100
。