检查两个列表是否包含相同的元素

时间:2016-09-19 10:22:07

标签: list erlang equality

我有两个函数返回相同大小的结果列表,我试图检查结果是否相同。列表中的顺序可以不同。我目前正在使用以下功能:

lists_are_the_same(List1, List2) ->
    List1 -- List2 =:= [].

此函数从另一个列表中减去一个列表,并检查结果是否为空列表。问题是,这种方法非常慢,在我的情况下,列表可能相当大。

有没有更快的方法来检查两个列表是否由完全相同的元素组成?

2 个答案:

答案 0 :(得分:6)

更快的方法是对每个列表进行排序,然后按如下方式对它们进行比较:

lists_are_the_same(List1, List2) ->
    lists:sort(List1) =:= lists:sort(List2).

根据Steve的评论,重要的是要知道 Erlang中的所有值都是可排序的并且具有defined order ,因此它适用于所有可能的列表元素。

答案 1 :(得分:3)

如果您的所有元素都唯一,您可能希望使用ordsets而不是lists。您还可以查看有关使用A -- B操作的documentation

  

lists:subtract(A, B)的复杂性与...成正比   length(A)*length(B),意味着AB都很慢   长名单。 (如果两个列表都很长,那么使用它是一个更好的选择   有序列表和ordsets:subtract/2

然后你可以通过以下方式检查它们是否相同:

ordsets:is_subset(List1,List2) andalso ordsets:is_subset(List2,List1)