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

Check if two lists consist of same elements

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

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

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

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

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

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

基于 Steve, it is important to know that all values in Erlang are sortable and have defined order 的评论,因此它适用于所有可能的列表元素。

如果您的所有元素都是 唯一的,您可能想使用 ordsets instead of lists. You can see also the documentation 关于使用 A -- B 操作:

The complexity of lists:subtract(A, B) is proportional to length(A)*length(B), meaning that it is very slow if both A and B are long lists. (If both lists are long, it is a much better choice to use ordered lists and ordsets:subtract/2.

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

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