#list #erlang #swap
#Список #erlang #поменять местами
Вопрос:
Как я могу быстро поменять местами два элемента в Erlang list?
Например, у меня есть list: [1,2,3,4]
, как я могу быстро получить [1,3,2,4]
?
Комментарии:
1. Вы имеете в виду переключить или заменить?
2. Вы хотите поменять местами элементы, не так ли? Если вы отредактируете свой вопрос и добавите информацию о том, как вы хотите указать, какие элементы вы хотите поменять местами, я добавлю это к своему ответу.
3. В вашем примере вы меняете элемент 2 на элемент 3. Если вы хотите заменить 2 элемента вместо этого, не могли бы вы, пожалуйста, сказать нам, какие 2 элемента вы хотите заменить на что именно?
4. Может быть, вам просто нужно использовать кортежи вместо списков?
Ответ №1:
Вы не сказали в своем вопросе, как вы хотите указать, какие два элемента вы хотите поменять местами.
Если вы просто хотите поменять местами элементы в позициях 2 и 3 в списке (как в вашем примере):
swap23([A,B,C|Rest]) ->
[A,C,B|Rest].
Ответ №2:
Что ж, если вы хотите поменять любой индекс другим, вы можете сделать следующее
swap(List,S1,S2) -> {List2,[F|List3]} = lists:split(S1-1,List),
LT = List2 [lists:nth(S2,List)|List3],
{List4,[_|List5]} = lists:split(S2-1,LT),
List4 [F|List5].
Комментарии:
1. Да, если он хочет поменяться местами… Я попытался отредактировать вопрос, чтобы сделать его понятным, но @shk настаивает, что он хочет заменить, а не поменять местами (см. Комментарии к Q), но не сообщает нам, что он хочет заменить на что.
Ответ №3:
С помощью этого кода вы просматриваете список только один раз.
swap(A, B, List) ->
{P1, P2} = {min(A,B), max(A,B)},
{L1, [Elem1 | T1]} = lists:split(P1-1, List),
{L2, [Elem2 | L3]} = lists:split(P2-P1-1, T1),
lists:append([L1, [Elem2], L2, [Elem1], L3]).
Пример использования:
1> swap(6,2,[1,2,3,4,5,6,7,8]).
[1,6,3,4,5,2,7,8]