0

たとえば、このように2つのリストを取りたいです。

find=["Hou","House","Mouse"]
repl=["Mou","Bird","House"]

だから私がそのようなテキストを与えるとき;

"The House with Mouse is big"

出力は次のようになります。

"The Mouse with House is big"

だから私はこれを書きました;

replace :: String->String->String->String
replace _ _ []=[]

replace find repl text
  = if take(length find) text == find
      then repl ++ replace find repl (drop (length find) text)
      else [head text] ++ (replace find repl (tail text))

replaceMore ::[String]->[String]->String->String
replaceMore _ _ []=[]
replaceMore _ [] _ =[]
replaceMore [] _ _ =[]
replaceMore find repl text
  = if (tail find) == [] || (tail repl)==[]
      then text
      else replaceMore (tail find)
                       (tail repl)
                       (replace (head find) (head repl) text)

戻る

"The Mouse with Mouse is big"

だから、私が望むようには機能せず、問題はここにあると思います。

replaceMore _ _ []=[]
replaceMore _ [] _ =[]
replaceMore [] _ _ =[]

しかし、まだこれを修正する方法がわかりません。アイデアはありますか?

4

2 に答える 2

2

作業アルゴリズムに向けていくつかのアイデアを提供するかもしれません。

まず、文字列に従って入力Stringをパーツ ( ) に分割する必要があります。したがって、この関数は[String]find

divideIntoParts :: [String] -> String -> [String]

これは次のように機能します

divideIntoParts find "The House with Mouse is big"

与える

["The ", "Hou", "se with ", "Mouse", " is big"]

そのため、文字列から置換する部分を抽出しますが、他の部分を同じリストに保持することで文字の順序を保持します。単純な実装は次のようになります

https://gist.github.com/Shekeen/5523749

次に、このリストをスキャンして、交換が必要な部品を交換する関数が必要になります。署名は

replaceParts :: [String] -> [String] -> [String] -> String

のように動作します

replaceParts find repl $ divideIntoParts find "The House with Mouse is big"

になります

"The Mouse with House is big"

したがって、完全なreplace関数は次のようになります

replacePatterns :: [String] -> [String] -> String -> String
replacePatterns find repl = (replaceParts find repl) . (divideIntoParts find)

findまた、より高速な部分文字列検索アルゴリズムを実装し、 andreplを 1 つに置き換えることを検討する必要があります。Data.Map

于 2013-05-05T10:38:08.263 に答える
0

私が見ることができる2つのバグがあります:

  1. findandの最後の要素replは常に無視されます。またはの場合にreplaceMore返されます。それはいつまたはである必要があります。texttail find == []tail repl == []find == []repl == []

    しかし、それらは以前の方程式によって捉えられるべきです

    replaceMore _ [] _ =[]
    replaceMore [] _ _ =[]
    

    あなたは今見ることができるはずですが、間違っていて、そうあるべきです

    replaceMore _ [] text = text
    replaceMore [] _ text = text
    
  2. しかし、出力は次のようになります

    "The House with House is big"
    

    まだ間違っています。これは、あなたが構築replaceMoreしているためですreplace。検索用語ごとに、テキストを検索し、見つかったら置き換えます。したがって"Hou""Mou"(so"House"は に置き換えられ"Mouse"ます);に置き換えます。その後、後で置き換えます(つまり、元のものが再び同じになること"Mouse"を意味します)。"House""House""House"

    代わりに、テキストを 1 回検索し、テキストを進める前に、特定の位置にあるすべての検索語を探してください。

于 2013-05-05T10:40:26.760 に答える