将字符串转换为另一种格式

时间:2011-01-13 10:43:42

标签: erlang

我想将二进制字符串<<"abc">>转换为以下字符串"<a><b><c>"。 换句话说,每个字节应写在一个“小于”字符和一个“大于”字符之间。

我想这个函数是递归的?请注意,abc只是一个例子!

4 个答案:

答案 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。看起来这个解决方案实际上是最有效的:)