开发者

convert a string into another format

I would like to convert the binary string <<"abc"&g开发者_Go百科t;> into the following string "<a><b><c>" . In other words, each byte shall be written between one "less than" char and one "greater than" char.

I suppose that the function is recursive ? Note that abc is just an example !


1>lists:flatten([[$<,C,$>]||C<-binary_to_list(<<"abc">>)]).
"<a><b><c>"

alternative

lists:flatmap(fun(C)-> [$<,C,$>] end,binary_to_list(<<"abc">>)).

or

f(C) -> [$<,C,$>].
lists:flatmap(fun f/1,binary_to_list(<<"abc">>)).


The most efficient if you want a flat list would probably be:

fr(<<C,Rest/binary>>) ->
    [$<,C,$>|fr(Rest)];
fr(<<>>) -> [].

This expansion is similar to what a list/binary comprehension expands to.


Use a binary comprehension:

2> [[$<, C, $>] || <<C:1/binary>> <= <<"abc">>].
[[60,<<"a">>,62],[60,<<"b">>,62],[60,<<"c">>,62]]

So you don't have to process the binary into a list first and then work on it. It is probably a bit faster, especially for large lists, so if performance matter to you, it may be a viable alternative option.


this answer is probably not best one in terms of efficiency(i didn't compare it to other solutions) but it certainly helps to understand how you can invent your own iterators over different collections in erlang aimed for achieving your specific goal instead of using predefined iterators

  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. it looks like this solution is actually the most efficient :)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜