检查两个列表是否包含相同的元素
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)
我有两个函数,它们 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 tolength(A)*length(B)
, meaning that it is very slow if bothA
andB
are long lists. (If both lists are long, it is a much better choice to use ordered lists andordsets:subtract/2
.
然后你可以通过以下方式检查它们是否相等:
ordsets:is_subset(List1,List2) andalso ordsets:is_subset(List2,List1)