如何对元组列表进行排序?

时间:2016-03-09 03:03:12

标签: haskell

我试图将(Int, Int)元组列表排序到一个int列表列表中[[Int]]

为什么呢?我发现了很多用例。基本上给出了这样的列表:

[(1,5), (2,3), (3,4), (4,5), (6,7), (7,8)]

我想返回一个列表:

[[1,2,3,4,5],[6,7,8]]

这是我到目前为止所拥有的:

pieces :: [(Int, Int)]
pieces = [(1,5), (2,3), (3,4), (4,5), (6,7), (7,8)]

linkStep :: [[Int]] -> (Int, Int) -> [[Int]]
linkStep (x:xs) (a, b)
    | elem a x = (b : x) : xs
    | elem b x = (a : x) : xs
    | otherwise = (a : b : x) : xs

-- Now I fold the linkStep function over the list
links :: [(Int, Int)] -> [[Int]]
links list = foldl linkStep [[]] list

但是,当我使用links致电pieces时,我得到了

links pieces
--[[8,6,7,5,4,2,3,1,5]]

我不确定自己做错了什么。 linkStep函数应该将结果列表中的元组元素连接到结果中的目标列表。如果元组元素尚未出现在结果列表中,则添加带有元组元素的新列表。但它不起作用......请帮忙!

1 个答案:

答案 0 :(得分:1)

我看到了几个问题:

  1. linkStep中,您只检查元组元素是否是第一个内部列表的成员。从您的示例来看,您似乎需要检查所有列表,而不仅仅是第一个列表。

  2. linkStep的情况下,您始终将abab添加到第一个内部列表中。因此,所有元素最终都会在第一个列表中结束。也许你打算在这里创建一个新列表?但它也可能是考虑其他列表的好地方。

  3. 希望这会帮助你取得进步。