繁体   English   中英

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 中并返回 true? 如果,假设 OrderProducts 有一个额外的元组,并且它的原子在 AmountOfProducts 中不存在,它会返回 false? 这个想法是这样的:

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中没有对应元组的键,如果这是一个空列表……我们返回true

第二版:高阶函数

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

在这里,我们基本上写了您在问题中写的内容,但是在 Erlang 代码中:如果OrderProduct所有元素的键也是AmountOfProducts中的键,则返回true

第三版:只比较键

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM