преобразовать строку в другой формат - PullRequest
2 голосов
/ 13 января 2011

Я хотел бы преобразовать двоичную строку <<"abc">> в следующую строку "<a><b><c>". Другими словами, каждый байт должен быть записан между одним символом "меньше чем" и одним "больше чем" символ.

Я полагаю, что функция рекурсивная? Обратите внимание, что abc это просто пример!

Ответы [ 4 ]

3 голосов
/ 13 января 2011
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">>)).
2 голосов
/ 13 января 2011

Наиболее эффективным, если вам нужен плоский список, вероятно, будет:

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

Это расширение похоже на то, к чему расширяется список / двоичное понимание.

1 голос
/ 13 января 2011

этот ответ, вероятно, не самый лучший с точки зрения эффективности (я не сравнивал его с другими решениями), но он, безусловно, помогает понять, как можно изобрести свои собственные итераторы для разных коллекций в 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, <<>>).

PS похоже, что это решение на самом деле наиболее эффективно:)

1 голос
/ 13 января 2011

Используйте двоичное понимание:

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

Так что вам не нужно сначала обрабатывать двоичный файл в списке, а затем работать с ним.Вероятно, это немного быстрее, особенно для больших списков, поэтому, если производительность важна для вас, это может быть жизнеспособным альтернативным вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...