Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Поменять местами элементы в массиве  [new]
ijuve10
Member

Откуда:
Сообщений: 54
Добрый день!

Подскажите пожалуйста, как решить следующий вопрос. Допустим, имеется массив из 10 элементов с числами от 1 до 10, т.е 1,2,3,4,5,6,7,8,9,10. Как можно поменять местами элементы в массиве, чтобы он выглядел следующим образом: 2,1,4,3,6,5,8,7,10,9?

Сначала я стараюсь разбить данный массив на два массива с четными и нечетными элементами, присваивая значения элементов основного массива к новыми двум. Но потом никак не могу объединить эти два массива в один, начиная с 1-го элемента четного массива, потом с 1-го элемента нечетного и т.д., чтобы в итоги получился массив 2,1,4,3,6,5,8,7,10,9.

Код выглядет следующим образом:
+
DECLARE
TYPE T_NUMBER_TAB IS TABLE OF NUMBER;
  L_NUMBER_TAB T_NUMBER_TAB; -- основной массив
  L_EVEN_TAB T_NUMBER_TAB; -- массив со значениями четных элементов основного массива
  L_ODD_TAB T_NUMBER_TAB; -- массив со значениями нечетных элементов основного массива
  L_POSITION NUMBER;
BEGIN
  L_NUMBER_TAB := T_NUMBER_TAB(1,2,3,4,5,6,7,8,9,10);
  L_EVEN_TAB   := T_NUMBER_TAB();
  L_ODD_TAB    := T_NUMBER_TAB();
  FOR I IN 1..L_NUMBER_TAB.COUNT
  LOOP
    IF MOD(I,2) = 0 THEN
      L_EVEN_TAB.EXTEND(1);
      L_POSITION             := L_EVEN_TAB.LAST;
      L_EVEN_TAB(L_POSITION) := L_NUMBER_TAB(I);
      --DBMS_OUTPUT.PUT_LINE(I || 'ODD' || ' L_POSITION: ' || L_POSITION || ' element: ' || L_NUMBER_TAB(I) || ' L_POSITION element: ' || L_EVEN_TAB(L_POSITION));
    ELSIF MOD(I,2) = 1 THEN
      L_ODD_TAB.EXTEND(1);
      L_POSITION            := L_ODD_TAB.LAST;
      L_ODD_TAB(L_POSITION) := L_NUMBER_TAB(I);
      --DBMS_OUTPUT.PUT_LINE(I || 'EVEN' || ' L_POSITION: ' || L_POSITION || ' element: ' || L_NUMBER_TAB(I) || ' L_POSITION element: ' || L_ODD_TAB(L_POSITION));
    END IF;
  END LOOP;
END;
8 апр 16, 09:52    [19031077]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1314
ijuve10,

0. Причем тут Oracle?
1. Массив - структура с произвольным доступом.
2. Делаешь новый массив и проходом по исходному пишешь в новый элементы по индексу
второй элемент, первый элемент, четвертый элемент, третий элемент....
3. Выход за границы сам узреешь.
8 апр 16, 10:05    [19031140]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
Тряхнем сединой...
Guest
DECLARE
TYPE T_NUMBER_TAB IS TABLE OF NUMBER;
  L_NUMBER_TAB T_NUMBER_TAB; -- основной массив
  L_POSITION NUMBER;
BEGIN
  L_NUMBER_TAB := T_NUMBER_TAB(1,2,3,4,5,6,7,8,9,10);

  if L_NUMBER_TAB.count < 2 then raise_application_info(-20000,'Too short array'); end if;

  L_POSITION := L_NUMBER_TAB.first;

  while L_NUMBER_TAB.exists(L_NUMBER_TAB.next(L_POSITION )) loop
    L_NUMBER_TAB(L_POSITION) := L_NUMBER_TAB(L_POSITION) + L_NUMBER_TAB(L_NUMBER_TAB.next(L_POSITION )) ;
    L_NUMBER_TAB(L_NUMBER_TAB.next(L_POSITION )) := L_NUMBER_TAB(L_POSITION) - L_NUMBER_TAB(L_NUMBER_TAB.next(L_POSITION )) ;
    L_NUMBER_TAB(L_POSITION) := L_NUMBER_TAB(L_POSITION) - L_NUMBER_TAB(L_NUMBER_TAB.next(L_POSITION )) ;
    L_POSITION := L_NUMBER_TAB.next((L_NUMBER_TAB.next(L_POSITION )));
    exit when L_POSITION is null;  
  end loop;

END;
8 апр 16, 10:47    [19031373]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
ijuve10,

+ препод наверное надеется что ты таки сам постараешься решить...
declare
   x sys.odcinumberlist := sys.odcinumberlist(1,2,3,4,5,6,7,8,9,10);
begin

   for i in 1 .. trunc(x.count / 2)
   loop
      x(2 * i - 1)   := x(2 * i - 1) + x(2 * i);
      x(2 * i)       := x(2 * i - 1) - x(2 * i);
      x(2 * i - 1)   := x(2 * i - 1) - x(2 * i);
   end loop;

   for i in 1 .. x.count
   loop
      dbms_output.put_line(x(i));
   end loop;

end;
/
8 апр 16, 12:45    [19032204]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
Складывать и вычитать
Guest
dbms_photoshop
x(2 * i - 1)   := x(2 * i - 1) + x(2 * i);

А кто сказал, что массив плотный?
А если не плотный - то где проверка на существование элементов с конкретными индексами?
8 апр 16, 13:07    [19032349]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Складывать и вычитать,

Да-да... не забудь еще заметить что сложение может вызвать переполнение.
8 апр 16, 13:11    [19032372]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
А еще количество элементов не об
Guest
dbms_photoshop
Складывать и вычитать,

Да-да... не забудь еще заметить что сложение может вызвать переполнение.

К сожалению, может, но это ограничение данного метода перестановок - врожденное и неисправимое :)
А вот неплотный массив - суровая реальность, которая, тем не менее, легко парируется, если не лениться - 19031373.
8 апр 16, 13:16    [19032411]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
А еще количество элементов не об,

Недоразумение, да и у тебя и у ТС массив без дырок.
Если тебе хочется оправдать свою прокто-стоматологию ты можешь писать сколько угодно,
но это личное дело каждого придумывать себе головняк на ровном месте или нет.
8 апр 16, 13:26    [19032481]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
А еще количество элементов не об,

А вообще ты случайно не из Индии?
Это у них принято, если какие-то кривые данные заходят из upstream, то вместо того чтоб их отсеять или исправить при загрузке в хранилище (с нормальным error logging ясное дело), это все говно сохраняется и в staging и далее в звезду без изменений, пишется в разнообразнейших местах страшнейший говнокод чтоб всё это хэндлить, и таки на самом финальном этапе данные приводятся к вменяемому виду для отчетности ибо пользователи видеть эту хрень не хотят.
8 апр 16, 13:32    [19032526]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
язательно четное
Guest
dbms_photoshop
на ровном месте или нет.

Ну-ну.
Когда ловишь exception на ровном месте спустя год в продуктиве - тогда и начинается настоящая проктостоматология, ведь ловишь с такой декларацией что? Прааальна, NO_DATA_FOUND, тля ее разбери :)
А куда ораклоид смотрит в первую голову увидев unhandled NO_DATA_FOUND в километровом коде?
Праальна, запросы он бежит изучать.
А код вида
for I in 1..tab.count loop

настолько привычен и надежен, что за него глаз в проктологическом аспекте стоматологии никак не цепляется.
В общем как в анекдоте - либо крестик снимите ( пишите в декларации index by binary_integer), либо трусы наденьте - ходите по коллекции next-ом, он для того и придуман.
И ник допишите к предыдущему, обрезалось :)
8 апр 16, 13:40    [19032605]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
язательно четное
ходите по коллекции next-ом, он для того и придуман
Научись для начала отличать nested table от associative array. Потом будешь рассуждать по чему и как ходить.

Да, чтобы избежать очередных срывов покровов, в моем примере если что varray.

Ну и в догонку, безтемповый своп неправильно сработает в случае null. Надо позаботиться и об этом!
_.extend(2);
_(_.last) := 12;
Проверяй.
8 апр 16, 13:53    [19032690]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
Пустота без Чапаева
Guest
dbms_photoshop
безтемповый своп неправильно сработает в случае null.

А вот это замечание - в тему, спасибо что заметил.
8 апр 16, 14:01    [19032738]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
booby
Member

Откуда:
Сообщений: 2254
Складывать и вычитать
..
А кто сказал, что массив плотный?
...

А можно встречных вопросов:
- кто сказал, что массив с четным числом элементов?
- зачем кто-то сказал, что от процесса перестановки нужно ждать его специфическую ошибку?
- почему двойная проверка завершения цикла - это круто для данного случая?

автор
...оправдать свою прокто-стоматологию ...


это не "прокто-стоматология" - это pl/sql.
Он не только предлагает "естественные" прототипы итераторов, но и допускает удаление элементов из множеств.

Прокто-стоматология - когда этому навязывают алгоритмы, построенные на законе исключения третьего.
Или копи-пастят алгоритмы, предполагающиеся быть автоматически оптимизированными
для совершенно других сред и условий выполнения.
В данном случае - перестановка сложением-вычитанием - это дохлого осла уши,
приставленные к бантику в петлице.

+
DECLARE
  TYPE T_NUMBER_TAB IS TABLE OF NUMBER;
  SUBTYPE T_A_INDEX IS Pls_integer;

  L_NUMBER_TAB T_NUMBER_TAB; -- основной массив

  L_POSITION T_A_INDEX;
  --
  l_next_position T_A_INDEX;
  n_tempVal Number;


BEGIN
  L_NUMBER_TAB := T_NUMBER_TAB(1,2,3,4,5,6,7,8,9,10,11);

  If L_NUMBER_TAB Is null 
       Then
         Return;
  End If; 
    
/* -- Пионэры, возьмитесь за руки и идите в жопу!
  if L_NUMBER_TAB.count < 2 then 
    raise_application_info(-20000,'Too short array'); 
   end if;
*/

    l_next_position := L_NUMBER_TAB.first - 1; 
    
    Loop
      L_POSITION := L_NUMBER_TAB.Next(l_next_position);
      l_next_position := L_NUMBER_TAB.Next(L_POSITION);      
      Exit When l_next_position Is Null;

      n_tempVal := L_NUMBER_TAB(L_POSITION);
      L_NUMBER_TAB(L_POSITION) := L_NUMBER_TAB(l_next_position);
      L_NUMBER_TAB(l_next_position) := n_tempVal;    
   End loop;

END;


ЗЫ
коллеги, я это без злобы писал.
Прошу и вас - без обид.
Сегодня пятница.
8 апр 16, 15:20    [19033434]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
booby,

Ах вот оно чё, надо было использовать два итератора.
Буби, а кем ты работаешь если не секрет?
Всегда было интересно кем надо быть чтоб так искусно генерировать маразм на форуме.
Без обид. Пятница. Легкий стеб.
8 апр 16, 15:34    [19033595]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
За попкорном уже пора?
Guest
booby
коллеги, я это без злобы писал.
Прошу и вас - без обид.


dbms_photoshop
booby,
Без обид. Пятница. Легкий стеб.


Они сошлись.
Вода и камень,
Стихи и проза,
Лед и пламень
Не так различны меж собой


...как дети...
8 апр 16, 15:42    [19033677]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
booby
Member

Откуда:
Сообщений: 2254
dbms_photoshop,
незачет.

Стеб -искусство производное.
Предполагается, что стебущийся хорошо владеет предметом, над которым стебется.
Вам пока надо оттачивать мастерство - учить слова.
8 апр 16, 15:42    [19033680]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
booby,

Твой ответ как обычно несет ноль смысловой нагрузки. Напомнило
- На самом деле самого дела нет. В самой деятельности заключена самость
дела - и наоборот. Наоборот получим оборот на, и таким образом
перевернем образ. Я уже не говорю о природе говора в роде при уже. Ужи и
узы - вы меня понимаете, мистер Андерсон?
- Конечно, я так и думал, Смит. Дай еще затянуться.

Тут слова учи-не учи... бредогенератор чинить надо.
8 апр 16, 15:54    [19033796]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
booby
Member

Откуда:
Сообщений: 2254
dbms_photoshop
booby,
...
Твой ответ как обычно несет ноль смысловой нагрузки.
...

Прошу прощения.
Действительно, у читателя нет возможности извлечь смысл из слов,
которых он не знает, поэтому не понимает.

Изучите вопрос о природе итератора,его связи атрибутами массива в языках, где такие есть,
а потом возвращайтесь - обсудим вопрос о количестве итераторов в коде,
к которому у вас не нашлось вразумительных комментариев.
8 апр 16, 16:14    [19034006]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
booby,

Прошу прощения, итератор один, счетчика два.
Подытоживая увлекательную беседу
(цэ) буби
ну, не все все что несомненно является бредом, обязательно он и есть, в некотором "космическом" смысле
17151700
8 апр 16, 16:49    [19034244]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
booby
Member

Откуда:
Сообщений: 2254
dbms_photoshop,

ну, так я не играю....
Зачем же подытоживая - рано еще.
автор
Прошу прощения...

ок. принято.

автор
счетчика два.


ну, пусть будет "счетчика".
есть ли желание объяснить свою точку зрения на "два счетчика"
- это универсально плохо для всех языков программирования
- это плохо специфически для pl/sql
- это универсально приемлемо в любом смысле
- это правильно для pl/sql
- для кода подобного сорта - для любых стековых языков хорошо

по какому основанию "два счетчика" хуже, чем пять вычислений (2 * i - 1) и четыре вычисления (2 * i)?
8 апр 16, 17:21    [19034374]     Ответить | Цитировать Сообщить модератору
 Re: Поменять местами элементы в массиве  [new]
Жук в муравейнике
Member

Откуда:
Сообщений: 717
Фотошоп, можно пойти по пути XOR
9 апр 16, 09:51    [19035913]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить