Elixir:检查数组是否包含另一个数组的所有值

Rud*_*koŭ 0 arrays contains elixir

我有两个数组:

arr1 = [1,2,3]
arr2 = [2,3] 
Run Code Online (Sandbox Code Playgroud)

什么是检查来自所有值最方便的方法,arr2包含arr1

sba*_*rob 6

如果您只想检查一个列表中的所有元素是否都存在于另一个列表中,您可以简单地使用--运算符左侧的较短列表:

iex> [2, 3] -- [1, 2, 3]
[]
Run Code Online (Sandbox Code Playgroud)

如果第一个列表中的所有元素都出现在第二个列表中,则结果应该是一个空列表。

但是请注意,这并不能解释某些情况,例如,如果您的第一个列表有重复元素,而另一个列表有该元素,但只有一次,您不会得到空列表:

iex> [2, 3, 3] -- [1, 2, 3]
[3]
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,从技术上讲,第二个列表不包含第一个列表中的所有元素。

如果您只想检查元素是否存在,还有其他简单的解决方案,例如:

Enum.all?([2, 3, 3], &Enum.member?([1, 2, 3], &1))
Run Code Online (Sandbox Code Playgroud)

但是,不确定它的效率如何,对于第一个列表的每个元素,您正在检查它是否存在于第二个列表中(但是,一旦一个元素不满足条件,它就会停止检查,并且来自Enum的函数通常经过优化,所以它可能已经足够好了)

还有一种选择是使用MapSet.

你可以做:

MapSet.subset?(MapSet.new([2, 3]), MapSet.new([1, 2, 3]))
Run Code Online (Sandbox Code Playgroud)

这也适用于重复元素,因为 MapSet 作为集合工作,因此您不能在其中包含重复元素。

  • 为了完整起见:`Enum.dedup([2, 3, 3]) -- [1, 2, 3]` :) (2认同)