文字列間の類似度を計算し、すべての一意の文字列を与えるScalaコードがあります。スカラ文字列の類似度
val filtered = z.reverse.foldLeft((List.empty[String],z.reverse)) {
case ((acc, zt), zz) =>
if (zt.tail.exists(tt => similarity(tt, zz) < threshold)) acc
else zz :: acc, zt.tail
}._1
私はここで何が起こっているかを説明してみましょう:
これは空の文字列(結果を蓄積する)と(の逆)から開始し、逆に入力データに対する倍数を使用しています残りの入力データ(これと比較する - 「z-tail」の場合はztというラベルが付けられています)。
倍そしてちょうど既存の一致がある場合
(それ自体または任意の以前のエントリと比較されませんので)、残りのデータの尾に対する各エントリをチェックし、データを循環、アキュムレータ(accとラベル付けされています)は通過できます。そうでない場合は、現在のエントリ(zz)をアキュムレータに追加します。この更新されたアキュムレータは、「残りの」文字列(zt.tail)の末尾とペアになって、比較対象の縮小セットを確実にします。
最後に、必要な残りの文字列と空のリスト(比較対象の文字列はありません)のリストを作成します。その結果、最初のものが結果として得られます。
第1回、第4回、第8回の文字列が似ている場合、問題は最初の繰り返しのようです。私は第1文字列のみを取得しています。その代わりに、私は(第1、第4、第8)のセットを取得する必要があります、次に2番目、5番目、14番目と21番目の文字列が似ている場合は、(2番目、5番目、14番目、21番目)のセットを取得する必要があります。
出力が期待されていないサンプル入力ができますか? –