Erlang 查找具有最小映射值的列表元素?
Erlang是否具有等效的 假设我有一个列表:Erlang 查找具有最小映射值的列表元素?,erlang,Erlang,Erlang是否具有等效的 假设我有一个列表: [ [{right, 1}, {up, 5}, {left, 4}], %element 1 [{up, 2}, {right, 3}, {down, 1}], %element 2 ... % element N ] 以及将这些元素映射到标量的函数,例如: f([{right, 1}, {up, 5}, {left, 4}]) -> 78. f([{up, 2}, {right, 3}, {down, 1}]) -> 6
[
[{right, 1}, {up, 5}, {left, 4}], %element 1
[{up, 2}, {right, 3}, {down, 1}], %element 2
... % element N
]
以及将这些元素映射到标量的函数,例如:
f([{right, 1}, {up, 5}, {left, 4}]) -> 78.
f([{up, 2}, {right, 3}, {down, 1}]) -> 6.
现在我想找到映射到最小值的元素。在这个例子中,我想找到[{up,2},{right,3},{down,1}]
Erlang的标准库如何帮助我做到这一点呢?没有一个内置函数可以完全做到这一点,但您可以为此编写一个简单的尾部递归函数,该函数在纯Erlang中尽可能高效:
min_by([H|T], F) ->
min_by(T, F, H, F(H)).
min_by([H|T], F, MinValue, MinMapped) ->
case F(H) of
NewMapped when NewMapped < MinMapped ->
min_by(T, F, H, NewMapped);
_ ->
min_by(T, F, MinValue, MinMapped)
end;
min_by([], _, MinValue, _) -> MinValue.
您可以使用以下事实:所有Erlang术语都是可比较的,元组具有字典顺序
MinBy = fun(L, F) ->
{_, Min} = lists:min([{F(X), X} || X <- L]),
Min
end.
L = [
[{right, 1}, {up, 5}, {left, 4}] %element 1
, [{up, 2}, {right, 3}, {down, 1}] %element 2
].
F = fun([{right, 1}, {up, 5}, {left, 4}]) -> 78;
([{up, 2}, {right, 3}, {down, 1}]) -> 6
end.
MinBy(L, F).
MinBy=fun(L,F)->
{,Min}=列表:Min([{F(X),X}| | x78;
([{up,2},{right,3},{down,1}])->6
结束。
明比(L,F)。
该死,这太好了!@Philip:很好,但比Dogbert的解决方案效率低一点。
MinBy = fun(L, F) ->
{_, Min} = lists:min([{F(X), X} || X <- L]),
Min
end.
L = [
[{right, 1}, {up, 5}, {left, 4}] %element 1
, [{up, 2}, {right, 3}, {down, 1}] %element 2
].
F = fun([{right, 1}, {up, 5}, {left, 4}]) -> 78;
([{up, 2}, {right, 3}, {down, 1}]) -> 6
end.
MinBy(L, F).