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

Insert Char at specific position in string Erlang

我想在 Erlang 字符串的 特定位置 插入一个 字符 .

例如。假设我想在字符串“123456789”的位置 3,5,7 插入“,”。

123456789 ~> 12,34,56,789

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

而不是作为完成的解决方案来回答,我向您展示了如何轻松地自己找到它。

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

simple_transform(Str,Positions)->

乙。将问题分成两部分。我们需要的?通过获取元素和索引遍历列表,对它们应用函数并检测元素是否在列表中。就这样。如果您需要使用列表,通常您将使用标准库中的模块列表。查看 documentation 并寻找合适的函数。

  1. 变换 - 它是 lists:map/2
  2. 迭代(从左到右遍历)——是lists:foldl/2; 但是由于这两个操作的组合非常流行,所以也有一个函数可以做到这一点。这是lists:mapfoldl/2
  3. 检测 - lists:member/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"