【问题标题】:Elixir: check array contains all the values of another arrayElixir:检查数组是否包含另一个数组的所有值
【发布时间】:2020-11-18 10:32:39
【问题描述】:

我有两个数组:

arr1 = [1,2,3]
arr2 = [2,3] 

检查arr2 中的所有值是否包含在arr1 中的最方便的方法是什么。

【问题讨论】:

    标签: arrays elixir contains


    【解决方案1】:

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

    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] :)
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2013-03-27
    • 2021-06-06
    相关资源
    最近更新 更多