Erlang поменять местами два элемента в списке

#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]