erlang list 使用 list 减法:map

Posted

技术标签:

【中文标题】erlang list 使用 list 减法:map【英文标题】:erlang list substract using list : map 【发布时间】:2016-08-22 12:34:45 【问题描述】:

我真的需要帮助来完成这项任务,具体如下: 我需要使用地图族来实现这个功能。

mapSub(List1,List2).

Subtracts List2 from List1  
Follows the order of appearance in
List2.  
Implement it using map family 
Examples:    
mapSub([1,2,3,4,5,1,2,3,4,5],[1,1,2]).  
[2,3,4,5,3,4,5]  
mapSub ([1,2,3,4,5,1,2,3,4,5],[1,1,2,2]).  
[2,3,4,5,3,4,5]

问题是如何使用允许使用的功能管理 List2, 例如,如果我从 List2 中找到第一个元素并删除他在 List1 中的第一次出现。 如何替换我要查找的元素 到 List2 尾部的头部(List2 中的下一个元素) 谢谢。

【问题讨论】:

我认为您将地图与列表混淆了。 Erlang 中的映射是关联 Key => Value 的哈希表,例如#a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "c" => 4。在您的问题中有两个列表。请重写问题,因为目前无法正确回答(可能应该关闭)。 @Amiramix:你认为地图家族不是指lists:map/2,而是maps?现在有点意思了。 我真的不知道地图族可能意味着什么,但是lists:map/2 与 Erlang 地图没有太大关系。它只是一个通过指定函数处理列表中的每个元素来转换列表的操作,请参阅***上的 map-reduce:en.wikipedia.org/wiki/MapReduce Erlang 中还有一种新的数据类型,称为 R17 中引入的映射,您可以阅读更多信息此处:learnyousomeerlang.com/maps 您需要确定您要使用的地图系列。 顺便说一句 [3,4,5,2,3,4,5] = [1,2,3,4,5,1,2,3,4,5] -- [1,1,2][3,4,5,3,4,5] = [1,2,3,4,5,1,2,3,4,5] -- [1,1,2,2] 所以你甚至没有正确的例子。 【参考方案1】:
mapSub(L1, L2) ->
    Inc = fun(X, Map) ->
                  Map#X => maps:get(X, Map, 0) + 1
          end,
    Map = lists:foldl(Inc, #, L2),
    sub(L1, Map).

sub([], _) -> [];
sub([H|T], Map) ->
    case maps:get(H, Map, 0) of
        0 ->
            [H | sub(T, Map)];
        N ->
            sub(T, Map#H => N - 1)
    end.

test() ->
    L1 = [1,2,3,4,5,1,2,3,4,5],
    ok = check(L1, [1,1,2]),
    ok = check(L1, [1,1,2,2]).

check(L1, L2) ->
    Expect = L1 -- L2,
    case mapSub(L1, L2) of
        Expect -> ok;
        Error -> error, [Expect, Error]
    end.

顺便说一句,您的示例结果是错误的,或者您的意思是 subtract-- 完全不同。

【讨论】:

【参考方案2】:
-module(wy).
-compile(export_all).


main() ->
    L1 = [1,2,3,4,5,1,2,3,4,5],
    L2 = [1,1,2],
    [2,3,4,5,3,4,5] = mapSub(L1, L2),
    [2,3,4,5,3,4,5] = mapSub([1,2,3,4,5,1,2,3,4,5],[1,1,2,2]).

mapSub(L1, L2) ->
    mapSub(L1, L2, []).

mapSub([], _, Res) ->
    lists:reverse(Res);
mapSub(L1, [], Res) ->
    lists:reverse(Res) ++ L1;
mapSub([H1 | T1], [H1 | T2], Res) ->
    mapSub(T1, T2, Res);
mapSub([H1 | T1], [H2 | _] = L2, Res) when H1 /= H2->
    mapSub(T1, L2, [H1 | Res]).

你可以试试这个代码。

您的问题是典型的递归。

【讨论】:

地图在哪里?

以上是关于erlang list 使用 list 减法:map的主要内容,如果未能解决你的问题,请参考以下文章

erlang list的使用与优化建议

Erlang Lists:展平嵌套列表

java 8中用于减去列表的减法运算

[Erlang开发之路]、lists模块扫盲

erlang下lists模块sort(排序)方法源码解析

Erlang List对笛卡尔积的理解