在字符串 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 并寻找合适的函数。
- 变换 - 它是 lists:map/2
- 迭代(从左到右遍历)——是lists:foldl/2;
但是由于这两个操作的组合非常流行,所以也有一个函数可以做到这一点。这是lists:mapfoldl/2
- 检测 - 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"
我想在 Erlang 字符串的 特定位置 插入一个 字符 .
例如。假设我想在字符串“123456789”的位置 3,5,7 插入“,”。
123456789 ~> 12,34,56,789
感谢任何帮助!!谢谢:)
而不是作为完成的解决方案来回答,我向您展示了如何轻松地自己找到它。
一个。定义输入数据 - 用于转换的 Str 字符串,Pos - 包含插入位置的列表。
simple_transform(Str,Positions)->
乙。将问题分成两部分。我们需要的?通过获取元素和索引遍历列表,对它们应用函数并检测元素是否在列表中。就这样。如果您需要使用列表,通常您将使用标准库中的模块列表。查看 documentation 并寻找合适的函数。
- 变换 - 它是 lists:map/2
- 迭代(从左到右遍历)——是lists:foldl/2; 但是由于这两个操作的组合非常流行,所以也有一个函数可以做到这一点。这是lists:mapfoldl/2
- 检测 - 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"