2016-03-20 22 views
1

私が作っている小さなプロジェクトのポケモンのリストがあります。ポケモンの名前を入力できる検索ボックスを追加しました。私は検索文字列に基づいて私のポケモンのリストをソートしたいと思います。文字列と検索文字列の比較?

私は「BUL」を検索した場合ので、たとえば、私はので、「冷遇BULリットル」と「グランBULリットル」(続く、最上位になるように、「ブル basaur」を期待します彼らはまた彼の名前に "bu"を持っているので、例えば "Wob bu fet"の後に、彼らの名前に "bul"を持つ)。

私はこれにどのような文字列比較を使用できますか?

注:私はElmで働いています。そのため、Elmのソリューションがあればいいですが、問題は主にまさに一般的です。

答えて

2

リスト内の各項目に重みを割り当てて、それを並べ替える関数を作成することができます。もし署名で関数を作成することができ:

assignWeight : String -> String -> (Int, String) 
assignWeight typed listItem = ... 

この関数は数値を割り当て、タプルの2番目の項目として、元の値と、タプルの最初の項目としてそれを返すことができます。

次に、重み付けアルゴリズムを構築するだけで、それらのルールは要件によって決定される必要があります。

たとえば、完全一致100を割り当てることができます。部分一致は、入力された文字列の一致度と、実際に一致する文字数によって決まります。これらのすべてのシナリオでRegexライブラリを使用して、部分正規表現をescape関数で構築することができます。例えば

、正規表現のように定義することができ、完全一致:部分一致があることができた

exactMatcher typed = 
    caseInsensitive <| regex <| "^" ++ escape typed ++ "$" 

partialMatcher = 
    caseInsensitive << regex << escape 

あなたはpartialMatcherの正規表現を使用する場合は、あなたが返さMatchを使用することができますindex値を使用して、文字列の深さを判定します。

入力された入力のバリエーション(例:"bul""bu""b")に対して部分一致を適用して、それをあなたの重み付けスコアに加えることさえできます。一日の終わりに

、あなたのソートアルゴリズムを使用しList.sortByfstを使用することができます。

List.sortBy (fst << assignWeight "bu") pokemon 
+0

をしかし、これはむしろ「妥当性」でそれらをソートするよりも、要素を削除し、リストをフィルタリングします。私は現在、単純な 'String.contains'を使用しています。これは何か類似しています。 –