过滤掉列表中n次的字符串

时间:2015-11-16 15:54:49

标签: haskell

给定一个字符串列表和一个整数c我想过滤掉列表中c次的字符串。问题是我不知道如何在我的函数中使用下一个元素,因为我不能只使用第一个元素,因为那时函数将无法正常工作。

testfunc :: [String] -> Int -> [String]

testfunc list c              
       | (length(filter (==(head list)) list) == c) = testfunc (filter (/=(head list)) list) c

1 个答案:

答案 0 :(得分:0)

如果返回列表中的元素与原始列表中的元素处于不同的相对位置,那么您可以轻松(并且具有更好的性能)通过排序的组合解决此问题em>,分组 concat 'ing:

testfunc list c = concat $ filter (\p -> length p /= c) $ group (sort list)

如果您想按照自己的方式进行操作,可以使用drop跳过列表中的第一个元素(这是错误的,请参阅编辑):

testfunc list c
   | list == [] = []              
   | (length(filter (==(head list)) list) == c) = testfunc (filter (/=(head list)) list) c
   | otherwise = testfunc (drop 1 list) c

我非常确定我理解你的问题,这就是你所需要的吗?

编辑:现在我理解你的问题了,你的功能在获取第一个元素后无法正常工作。如果保持秩序很重要,你可以试试:

testfunc list c = filter (\s -> s `elem` validStrings) list
          where validStrings = map head $ filter (\p -> length p /= c) $ group (sort list)