我想将二进制字符串<<"abc">>
转换为以下字符串"<a><b><c>"
。
换句话说,每个字节应写在一个“小于”字符和一个“大于”字符之间。
我想这个函数是递归的?请注意,abc只是一个例子!
答案 0 :(得分:3)
1>lists:flatten([[$<,C,$>]||C<-binary_to_list(<<"abc">>)]).
"<a><b><c>"
替代
lists:flatmap(fun(C)-> [$<,C,$>] end,binary_to_list(<<"abc">>)).
或
f(C) -> [$<,C,$>].
lists:flatmap(fun f/1,binary_to_list(<<"abc">>)).
答案 1 :(得分:2)
如果你想要一个平面列表,最有效的可能是:
fr(<<C,Rest/binary>>) ->
[$<,C,$>|fr(Rest)];
fr(<<>>) -> [].
此扩展类似于列表/二进制理解扩展到的内容。
答案 2 :(得分:1)
使用二进制理解:
2> [[$<, C, $>] || <<C:1/binary>> <= <<"abc">>].
[[60,<<"a">>,62],[60,<<"b">>,62],[60,<<"c">>,62]]
因此,您不必先将二进制文件处理到列表中,然后再对其进行处理。它可能会快一些,特别是对于大型列表,所以如果性能对您很重要,那么它可能是一个可行的替代选择。
答案 3 :(得分:1)
这个答案在效率方面可能不是最好的(我没有将它与其他解决方案进行比较),但它肯定有助于理解如何在erlang中针对不同集合创建自己的迭代器,以实现您的特定目标使用预定义的迭代器
fr(<<>>, Output) -> Output;
fr(<<"b", Rest/binary>>, Output) ->
fr(Rest, <<Output, "b">>);
fr(<<C:8, Rest/binary>>, Output) ->
fr(Rest, <<Output/binary, $<, C:8, $>>>).
f(Input) -> fr(Input, <<>>).
P.S。看起来这个解决方案实际上是最有效的:)