在字符串中排序出现字符

时间:2015-10-23 21:17:48

标签: haskell

我希望在字符串中出现所有出现的字符。 所以例如,如果我有字符串“nunddrdr”,我想得到“nnudddrr”。

这就是代码应该如何实现的目的:

usort :: String -> String

l :: String
l = ""

usort (x:xs)
    | xs == []  = l ++ [x]
    | otherwise = l ++ [n | n <- (x:xs), n = x] ++ usort (xs)

它无法正常工作,因为它还会处理已使用过的字符。

1 个答案:

答案 0 :(得分:2)

您已正确观察到对usort的递归调用未删除已使用过的字符,因此您需要修改该函数以便执行此操作。您可以使用filter仅选择符合某些条件的列表元素,因此我们可以删除已使用的字符,如下所示:

filter (\=x) xs

我们可以使用

以相同的方式选择与x匹配的所有字符
filter (==x) xs

您可以使用这两件事来创建usort功能:

usort (x:xs) = x : (filter (==x) xs) ++ usort (filter (/=x) xs)

但是,当您尝试对空列表进行排序时,您未能考虑这种情况,因此您还需要添加:

usort [] = []

把它放在一起,你得到

usort::(Eq a)=>[a]->[a]
usort [] = []
usort (x:xs) = x : filter (==x) xs ++ usort (filter (/=x) xs)