Erlang 如何检查元组列表中的所有元素是否存在于另一个元组列表中

Erlang how to check if all elements in a list of tuples exists in another list of tuples

假设我有两个列表:AmountOfProducts,其中有一个元组列表,例如

[{apple, 10}, {chocolate, 13}, {lettuce, 9}, {mango, 20}]

第二个列表是 OrderProducts,它有像

这样的元组
[{apple, 3}, {chocolate, 1}, {mango 4}]

第一个元素是产品名称的原子,第二个元素是数量,对于 AmountOfProducts,数量是可用数量,对于 OrderProducts,数量是其要求的数量。 有没有办法检查 OrderProducts 的所有原子是否存在于 AmountOfProducts 中并且 return 为真?如果假设 OrderProducts 有一个额外的元组,并且它的原子不存在于 AmountOfProducts 中,那么它 return 是假的吗?这个想法是这样的:

AmountOfProducts = [{apple, 10}, {chocolate, 13}, {lettuce, 9}, {mango, 20}]
OrderProducts = [{apple, 3}, {chocolate, 1}, {mango 4}]

check_products(AmountOfProducts, OrderProducts) ->
    if
        all atoms inside OrderProducts exists in AmountOfProducts -> true;
        one or many of the atoms inside OrderProducts doesnt exist in AmountOfProducts -> false
    end.

在给定的两个列表的情况下,它应该返回为真。有没有办法做到这一点?我希望这是有道理的,谢谢!

我将向您展示几种解决此问题的方法。

第一个版本:列表解析

check_products(AmountOfProducts, OrderProducts) ->
  [] ==
    [Key || {Key, _} <- OrderProducts
          , not lists:keymember(Key, 1, AmountOfProducts)].

这里我们基本上收集了 OrderProducts 中所有在 AmountOfProducts 中没有相应元组的键,如果那是一个空列表……我们 return true

第二版:高阶函数

check_products(AmountOfProducts, OrderProducts) ->
  lists:all(
    fun({Key, _}) ->
      lists:keymember(Key, 1, AmountOfProducts)
    end, OrderProducts).

这里我们基本上写下你在问题中写的内容,但在 Erlang 代码中:Return true 如果 all 的键 OrderProduct 也是 AmountOfProducts.

中的键

第三版:只比较按键

现在,如果你知道在任何列表中都不会出现重复的键,你也可以这样写你的代码……

check_products(AmountOfProducts, OrderProducts) ->
  [] == keys(OrderProducts) -- keys(AmountOfProducts).

基本上是说,如果我们从 OrderProducts 的键列表中删除 AmountOfProducts 中的所有键...我们最终没有键(它们都被删除,因为它们属于 AmountOfProducts). 您必须实现一个辅助功能 keys/1,但希望该功能更容易实现(或者您可以只使用 proplists:get_keys/1.