在字符串 Erlang 中的特定位置插入字符



我希望在 Erlang 字符串中的特定位置插入一个字符

例如。假设我希望在字符串"123456789"中插入","的位置 3,5,7。

123456789 ~> 12,34,56,789

任何帮助感谢!!谢谢:)

相反,回答为完成的解决方案,我展示了您如何轻松找到它。

A. 定义输入数据 - 用于转换的 str 字符串,Pos - 包含插入位置的列表。

simple_transform(Str,Positions)->

B.将问题分成一部分。我们需要什么?通过获取元素和索引迭代列表,对它们应用函数并检测列表中是否元素。就这样。如果您需要使用列表,通常您将使用标准库中的模块列表。查看文档并寻找合适的功能。

  1. 变换 - 列表:地图/2
  2. 迭代(从左到右遍历( - 它是列表:折叠/2;但是由于这两种操作的组合非常流行,因此还有一个功能可以做到这一点。它是列表:地图折叠/2
  3. 检测 - 它是列表:成员/2;

将所有内容收集在一起:

simple_transform(Str,Positions)->
{List,_}=lists:mapfoldl(
fun(El,Acc)->case lists:member(Acc,Positions) of
    true ->{[$,,El],Acc+1};
    false ->{El,Acc+1} end end,1,Str),
 lists:flatten(List).

以下解决方案要求将职位列表从低到高排序:

1( 要插入单个字符串

insert_test() ->
    "a,b" = insert(",", "ab", [2]),
    ",a"  = insert(",", "a", [1]),
    "ab"  = insert(",", "ab", [3]),
    "a,b,c" = insert(",", "abc", [2,3]),
    all_tests_passed.
insert([InsertChar], String, Positions) ->
    insert(InsertChar, String, Positions, 1, []).
insert(InsertChar, [Char|Chars], [Index|Ps], Index, Acc) ->
    insert(InsertChar, Chars, Ps, Index+1, [Char,InsertChar|Acc]);
insert(InsertChar, [Char|Chars], Ps, Index, Acc) ->
    insert(InsertChar, Chars, Ps, Index+1, [Char|Acc] );
insert(_, [], _, _, Acc) ->
    lists:reverse(Acc).

2( 要插入随机长度的字符串

insert_test() ->
    "a,b" = insert(",", "ab", [2]),
    ",a"  = insert(",", "a", [1]),
    "a--b" = insert("--", "ab", [2]),
    "--ab" = insert("--", "ab", [1]),
    "a--b--c" = insert("--", "abc", [2,3]),
    all_tests_passed.
insert(InsertStr, Str, Positions) ->
    insert(InsertStr, Str, Positions, 1, []).
insert(InsertStr, [Char|Chars], [Index|Ps], Index, Acc) ->
    insert(InsertStr, Chars, Ps, Index+1, combine(InsertStr, Char, Acc) );
insert(InsertStr, [Char|Chars], Ps, Index, Acc) ->
    insert(InsertStr, Chars, Ps, Index+1, [Char|Acc]);
insert(_, [], _, Acc, _) ->
    lists:reverse(Acc).

combine_test() ->
    ",X" = lists:reverse( combine(",", $X, []) ),
    "a,X" = lists:reverse( combine(",", $X, "a") ),
    "ab--X" = lists:reverse( combine("--", $X, lists:reverse("ab") ) ),
    all_tests_passed.
combine([], X, Acc) ->
    [X|Acc];
combine([Char|Chars], X, Acc) ->
    combine(Chars, X, [Char|Acc]).

如果您只想将字符串转换为非常特定的格式:

insert_commas(String) ->
  string:join([string:substr(String, 1, 2), ",", string:substr(String, 3, 2), ",", string:substr(String, 5, 2), ",", string:substr(String, 7)], "").

module:insert_commas("123456789").` returns `"12,34,56,789"

最新更新