【发布时间】:2020-11-18 10:32:39
【问题描述】:
我有两个数组:
arr1 = [1,2,3]
arr2 = [2,3]
检查arr2 中的所有值是否包含在arr1 中的最方便的方法是什么。
【问题讨论】:
我有两个数组:
arr1 = [1,2,3]
arr2 = [2,3]
检查arr2 中的所有值是否包含在arr1 中的最方便的方法是什么。
【问题讨论】:
如果您只想检查一个列表中的所有元素是否存在于另一个列表中,您可以简单地使用 -- 并使用运算符左侧的较短列表:
iex> [2, 3] -- [1, 2, 3]
[]
如果第一个列表中的所有元素都存在于第二个列表中,则结果应该是一个空列表。
但是请注意,这并不适用于某些情况,例如,如果您的第一个列表有一个重复的元素,而另一个列表有该元素,但只有一次,您将不会得到一个空列表:
iex> [2, 3, 3] -- [1, 2, 3]
[3]
但在这种情况下,从技术上讲,第二个列表并不包含第一个列表中的所有元素。
如果您只想检查元素是否存在,还有其他简单的解决方案,例如:
Enum.all?([2, 3, 3], &Enum.member?([1, 2, 3], &1))
但不确定它的效率如何,对于第一个列表的每个元素,您正在检查它是否存在于第二个列表中(但是,一旦一个元素不满足条件,它将停止检查,而Enum 中的函数通常都经过优化,因此可能已经足够好了)
还有一个选择是使用MapSet。
你可以这样做:
MapSet.subset?(MapSet.new([2, 3]), MapSet.new([1, 2, 3]))
这也适用于重复元素,因为 MapSet 是作为集合工作的,因此您不能在其中包含重复元素。
【讨论】:
Enum.dedup([2, 3, 3]) -- [1, 2, 3] :)