Erlang:删除地图列表中的地图,然后返回列表

时间:2015-11-16 07:07:38

标签: list erlang maps

我目前正在我的程序的服务器端工作,我正在寻找一种方法来消除某个地图后我发现它有我正在搜索的原子。

以下代码可以成功找到地图列表中是否存在带有原子的地图,但我正在寻找一种从列表中删除该地图的方法,并返回整个列表,而不是我刚刚删除的地图。 / p>

“Asistente”是我正在寻找的原子。 L_Asistente是地图列表

第一种方法是当你覆盖整个列表并且没有在地图列表中找到原子时。

第二个是搜索本身。目前,它会在找到目标时返回true,但我想将其更改为整个列表减去具有我正在搜索的原子的地图。

server_checaExistenciaBorrarAsistente(_, []) ->
    false;

server_checaExistenciaBorrarAsistente(Asistente, L_Asistentes) ->
    [MapAsistente | Rest] = L_Asistentes,
    io:format("~p == ~p ~n", [MapAsistente, Asistente]),
    case maps:get("clave",MapAsistente) == Asistente of
        true ->
            true;
        false -> 
            server_checaExistenciaAsistente(Asistente, Rest)
    end. 

3 个答案:

答案 0 :(得分:1)

一种简单的方法是使用list comprehension检查您正在寻找的密钥是否存在:

server_checaExistenciaBorrarAsistente(Asistente, L_Asistentes) ->
    [MapAsistente || MapAsistente <- L_Asistentes,
         maps:find("clave", MapAsistente) =/= {ok, Asistente}].

更模块化的方法是允许自定义过滤条件:

server_checaExistenciaBorrarAsistente(Asistente, L_Asistentes) ->
    filter(L_Asistentes, fun(M) -> maps:find("clave", M) =/= {ok, Asistente} end).

filter(Maps, Filter) ->
    [Map || Map <- Maps, Filter(Map)].

答案 1 :(得分:0)

在这里你需要使用累加器:

server_checaExistenciaBorrarAsistente(_, [], Acc) ->
    Acc;

server_checaExistenciaBorrarAsistente(Asistente, [MapAsistente | Rest], Acc) ->
    io:format("~p == ~p ~n", [MapAsistente, Asistente]),
    case maps:find("clave", MapAsistente) of
        {ok, _} ->
            server_checaExistenciaBorrarAsistente(Asistente, Rest, Acc);
        error -> 
            server_checaExistenciaBorrarAsistente(Asistente, Rest, lists:append(Acc, [MapAsistente]))
    end. 

结果:

#{"abc" => 1,"clave" => a1} == #{"abc" => 1,"clave" => a1}
#{"abc" => 2,"clave1" => a2} == #{"abc" => 1,"clave" => a1}
#{"abc" => 3,"clave2" => a3} == #{"abc" => 1,"clave" => a1}
#{"abc" => 4,"clave3" => a4} == #{"abc" => 1,"clave" => a1}
[#{"abc" => 2,"clave1" => a2},
 #{"abc" => 3,"clave2" => a3},
 #{"abc" => 4,"clave3" => a4}]

你想这样做吗?

答案 2 :(得分:0)

server_checaExistenciaBorrarAsistente(Asistente, L_Asistentes) ->
    [MapAsistente || MapAsistente <- L_Asistentes,
         maps:find("clave", MapAsistente) =/= {ok, Asistente}].
     
server_checaExistenciaBorrarAsistente(Asistente, L_Asistentes) ->
    filter(L_Asistentes, fun(M) -> maps:find("clave", M) =/= {ok, Asistente} end).

filter(Maps, Filter) ->
    [Map || Map <- Maps, Filter(Map)].
     

所以让我直截了当。你使用“for”esque函数去   抛出列表并检查每个地图,然后开始比较。现在   部分我不明白你是如何过滤它的。

python中,列表理解更具可读性:

results = [Map for Map in Maps if “clave” in Map]

而且,如果你想要,你可以将if条件提取到函数中:

def yes_or_no(Map):
    if 'clave’ in Map:
        return True
    else:
        return False

results = [Map for Map in Maps if yes_or_no(Map)]

请注意yes_or_no()接受一个参数并返回True或False。

以下是您想知道的两个erlang examples

1)

server_checaExistenciaBorrarAsistente(Asistente, L_Asistentes) ->
    [MapAsistente || MapAsistente <- L_Asistentes,
         maps:find("clave", MapAsistente) =/= {ok, Asistente}].

如果你进行这些替换:

|| ... for  
<- ... in
,  ... if

然后你会得到一个python列表理解:

[MapAsistente for MapAsistente in L_Asistentes if
         maps:find("clave", MapAsistente) =/= {ok, Asistente}].

所以你可以看到,在erlang列表推导中,,是一个if-esque结构。在这种情况下,maps:find()返回true / false,它确定Map是否将包含在结果列表中,类似于python list comprehension中的yes_or_no()

2)

server_checaExistenciaBorrarAsistente(Asistente, L_Asistentes) ->
    filter(L_Asistentes, fun(M) -> maps:find("clave", M) =/= {ok, Asistente} end).

filter(Maps, Filter) ->
    [Map || Map <- Maps, Filter(Map)].

在这种情况下,不是使用列表推导来计算server_checaExistenciaBorrarAsistente()内的结果,而是创建结果列表的所有工作都被传递给辅助函数,该函数可以命名为get_results():

server_checaExistenciaBorrarAsistente(Asistente, L_Asistentes) ->
    get_results(...).

get_results(Maps, Filter) ->
    [Map || Map <- Maps, Filter(Map)].

在python中,列表理解将如下所示:

[Map for Map in Maps if Filter(Map)]

辅助函数get_results()需要两个参数来构造结果:

  1. 地图列表。

  2. 一个接受一个参数并返回true或false的函数,以指示Map是否应包含在结果列表中 - 就像python yes_or_no()函数一样。

  3. get_results()内,你有与第一种情况相同的列表理解结构:

    [Map || Map <- Maps, Filter(Map)]
    

    但是这次,true / false由传递给辅助函数并存储在Filter变量中的函数决定。

    如果有帮助,这是一个非常简单的例子:

    func() ->
        my_helper(fun lists:reverse/1).
    
    my_helper(SomeFunc) ->
        SomeFunc([1 , 2, 3]).
    

    示例:

    9> c(my).
    {ok,my}
    10> my:func().   
    [3,2,1]