[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