最近、2セットの履歴データを比較する必要がありました。そのうちの1つで1日か2日が欠落していることがあり、正確にしたかったので、すべての可能な日付のリストと、両方のセットに属する日付と対応する値を含むタプルの2つのリストを作成することにしました。Map
次に、日付の検索を改善するために、後者のリストをsに変更しました。
アイデアは、両方のpedリストの完全な日付リストからすべての日付を見つけて、両方のデータセットに日付と値が含まれる日付のみを含むMap
「トリプル」のリストを作成することでした。(date, value1, value2)
次に、それらをファイルに書き込んで、適切に比較することができます。
コードを気にしないでください、それは良い測定のためだけに含まれています
コードは次のとおりです(これはまったく最適ではありませんが、その小さなタスクではうまく機能しました):
import qualified Data.Map as M
import Data.List (transpose)
import Data.Maybe (fromJust)
main = do
dts <- readFile "dates.txt"
cts1 <- readFile "eu.txt"
cts2 <- readFile "usa.txt"
let
dates = lines dts
cols1 = transpose $ map words $ lines cts1
cols2 = transpose $ map words $ lines cts2
prs1 = zip (head cols1) (last cols1)
prs2 = zip (head cols2) (last cols2)
map1 = M.fromList prs1
map2 = M.fromList prs2
trips = map fromJust (filter (/=Nothing) (map (\date -> getTrips date map1 map2) dates))
cols3 = map (\(a,b,c) -> [a,b,c]) trips
result = unlines $ map unwords $ cols3
writeFile "trips.txt" result
getTrips :: String -> M.Map String String -> M.Map String String -> Maybe (String, String, String)
getTrips date map1 map2
| is1 /= Nothing && is2 /= Nothing = Just (date, fromJust is1, fromJust is2)
| otherwise = Nothing
where
is1 = M.lookup date map1
is2 = M.lookup date map2
TL; DR:コードは機能しましたが(私はいくつかの意見/アドバイスを喜んで聞きますが)、いくつか質問があります:
- 日付は2000前後しかなかったので、パフォーマンスについてはあまり気にしませんでした(
String
どこでもsを使用していたことがわかります)。Data.Map
その時、やり過ぎを使っていましたか?タプルのリストよりもいつ優先されるべきですか?Data.Map
- sのタプルから作成されました-バランシング
Map
とルックアップが正しく機能するために、キーは常に数値である必要がありますか?String