计算两个列表中相同值元素对的数量(Haskell)

时间:2016-09-06 06:03:32

标签: list haskell

我想计算两个列表中的一对相互元素的数量,而不使用Prelude和Data.List之外的任何函数。每场比赛只计算一次。

例如:

[A,B,A]和[C,A,C]返回1(仅1 A)。

[A,A,A]和[A,C,A]返回2(2A)。

[A,B,C]和[C,A,A]返回2(A和C)。

这是我的尝试,我希望尽可能短,但失败了。

length filter (`elem` list1) list2

我的代码计数将为[A,B,A]和[C,A,C]返回2,因为它会计算两个列表中的所有匹配项。

2 个答案:

答案 0 :(得分:2)

只需递归排序和计算。

getMatch :: Ord a => [a] -> [a] -> Int
getMatch l r = getMatch' (sort l) (sort r)

getMatch' [] _ = 0
getMatch' _ [] = 0
getMatch' l@(a: as) r@(b: bs) | a < b = getMatch' as r
                              | a == b = getMatch' as bs + 1
                              | otherwise = getMatch' l bs

测试:

λ> getMatch "ABA" "CAC"
1
λ> getMatch "AAA" "ACA"
2
λ> getMatch "ABC" "CAA"
2

答案 1 :(得分:2)

这是一个解决方案:

import Data.List

countEm count []       l2 = count
countEm count (x : xs) l2 = if elem x l2
                             then countEm (count + 1) xs (delete x l2)
                             else countEm count xs l2

delete函数来自Data.List,只从列表中删除一个元素。

测试您的示例:

> countEm 0 "ABA" "CAC"
1
> countEm 0 "AAA" "ACA"
2
> countEm 0 "ABC" "CAA"
2

elemdelete合并到具有这两项职责的函数中仍然可以提高效率。