2016-01-23 65 views
3

我需要將多個列表與常用元素合併爲一個。我應該在清單內做到這一點。在Haskell中合併類似的列表清單

例如:

INPUT: [[1,2,3],[5,6],[8,3,11],[4,9,1]]

MY輸出: [[1,2,3,8,3,11,1,2,3,4,9,1],[]]

需要的輸出: [[1,2,3 ,8,11,9],[5,6]]

另一個例子:

INPUT: [[4],[0],[7,10],[6],[6]]

MY輸出: [[6,6],[]]

OUTPUT: [[4],[0],[7,10],[6]]

我的代碼:

mergeAllLists :: [[Integer]] -> [[Integer]] 
mergeAllLists (x:[]) = [x] 
mergeAllLists (x:[]:y) = [x] 
mergeAllLists (x:y:[]:_) = mergeOneToAll_ x [y] 
mergeAllLists (x:xs) = mergeAllLists (mergeOneToAll x xs) 

mergeOneToAll :: [Integer] -> [[Integer]] -> [[Integer]] 
mergeOneToAll _ [] = [[]] 
mergeOneToAll list (y:list_of_list) = (mergeLists list y) : (mergeOneToAll list list_of_list) 
+0

列表中是否包含數字的兩次出現?如果它們是重要的?我的意思是:如果輸入是[[1,1,2],[2,3]],你會介意結果是[[1,2,3]]而不是'[[1,1 1,2,3]]'? – Bakuriu

+0

是的,我可以刪除重複以後 – dandycomp

回答

2
mergeAllLists :: [[Integer]] -> [[Integer]] 
mergeAllLists = foldl mergeOneToAll [] 

mergeOneToAll :: [[Integer]] -> [Integer] -> [[Integer]] 
mergeOneToAll [] xs = [xs] 
mergeOneToAll (as:acc) xs = 
    if null $ intersect xs as then 
    as : mergeOneToAll acc xs 
    else 
    (as ++ xs) : acc 

我t雖然不是很有效(不是尾遞歸)。讓我知道它是否需要更高效,我會嘗試改進它。

+0

Thx很多,它的工作 – dandycomp