[Moscow.pm] Вставка в спиоск в определенное место
Олег Малёваный
deer_oleg на mail.ru
Пн Дек 7 04:28:03 PST 2009
Всем добрый день!
Никак не могу придумать алгоритм
Суть такая:
есть список объектов. У которых есть поле - порядок сортировки
например, можно изобразить это так
%a = (a=>0,b=>4,c=>10);
то есть объект a имеет индекс 0, объект b имеет индекс 4, с имеет 10
номер сортировки от 0 до 10
есть ещё один объект.
$s = (d=>1);
Его нужно вставить в список, не нарушив предидущий порядок, и чтобы индексы
не пересекались. Если порядки сортировки совпадают, то надо вставить перед
элементом в списке.
Поясню на примерах:
# исходный "массив"
%a = (a=>0,b=>4,c=>10);
$s = (d=>1);
# результат
%b = (a=>0,b=>4,c=>10, d=>1); #все просто
# исходный "массив"
%a = (a=>0,b=>4,c=>10);
$s = (d=>0);
# результат
%b = (d=>0, a=>1,b=>4,c=>10); #"d" встает на место "a", а "a" двигается в
право
# если "a" занимает чьето место, то и она должна тот элемент подвинуть и
т.д.
# исходный "массив"
%a = (a=>0,b=>4,c=>10);
$s = (d=>10);
# результат
%b = (a=>0,b=>4,c=>10, d=>9); # у "d" уменьшается индекс
# если "d" занимает чьето место, то должна тот элемент подвинуть и т.д.
# исходный "массив"
%a = (a=>0,b=>4,c=>10);
$s = (d=>4);
# результат
%b = (a=>0,b=>5,c=>10, d=>4);
# или такой
%b = (a=>0,b=>4,c=>10, d=>3);
# тут нет разницы куда встанет "d" на место "b" или перед ним
Вот что то даже не приходит в голову с чего начать.
В конечном итоге там список будет, а не хеш (я его для простоты нарисовал)
типа такого
@a = (
{
name => a,
sort => 0,
},
{
name => b,
sort => 4,
},
{
name => c,
sort => 10,
},
);
Может есть что то стандартное для этих целей? Или мысль кто подкинет
полезную :)
------
С Уважением, Олег Малёваный
Подробная информация о списке рассылки Moscow-pm