Erlang如何校验元组列表的所有元素原子存在于另一元组列表
Erlang 订单商品库存存在性校验实现
实现思路
- 第一步提取库存列表中所有商品名,生成可快速查询的集合
- 第二步遍历订单所有商品,逐一校验商品名是否存在于库存商品集合中,所有商品都存在则返回
true,任意一个不存在返回false
基础实现(适合小体量库存列表)
直接用Erlang标准库lists模块的all和member方法实现,代码简洁易读:
check_products(AmountOfProducts, OrderProducts) -> % 提取库存所有商品名 StockNames = [Name || {Name, _Count} <- AmountOfProducts], % 批量校验订单商品是否都在库存名列表中 lists:all(fun({OrderName, _Demand}) -> lists:member(OrderName, StockNames) end, OrderProducts).
优化实现(适合大体量库存列表)
如果库存商品数量非常多,可将库存商品名转为sets集合降低查询复杂度,提升执行效率:
check_products(AmountOfProducts, OrderProducts) -> % 生成库存商品名集合,查询复杂度O(1) StockNameSet = sets:from_list([Name || {Name, _Count} <- AmountOfProducts]), lists:all(fun({OrderName, _Demand}) -> sets:is_element(OrderName, StockNameSet) end, OrderProducts).
效果测试
用你给出的示例测试返回结果符合预期:
1> AmountOfProducts = [{apple, 10}, {chocolate, 13}, {lettuce, 9}, {mango, 20}]. [{apple,10},{chocolate,13},{lettuce,9},{mango,20}] 2> OrderProducts = [{apple, 3}, {chocolate, 1}, {mango, 4}]. [{apple,3},{chocolate,1},{mango,4}] 3> check_products(AmountOfProducts, OrderProducts). true
如果订单中出现库存不存在的商品,比如OrderProducts = [{apple,3}, {orange,2}],调用函数会返回false。
内容的提问来源于stack exchange,提问作者Marcelo Márquez
相关产品推荐
相关产品推荐

