Если вместо чисел в поле sort использовать строки, а вместо &#39;&lt;=&gt;&#39; брать &#39;cmp&#39;, то все очень легко разруливается добавлением символа &#39;a&#39; в конец строки.<br><br>На бейсике все программировали? Все помним, почему строки через 10 нумеровались? :)<br>
<br><div class="gmail_quote">7 декабря 2009 г. 13:28 пользователь Олег Малёваный <span dir="ltr">&lt;<a href="mailto:deer_oleg@mail.ru">deer_oleg@mail.ru</a>&gt;</span> написал:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Всем добрый день!<br>
<br>
Никак не могу придумать алгоритм<br>
<br>
Суть такая:<br>
есть список объектов. У которых есть поле - порядок сортировки<br>
например, можно изобразить это так<br>
%a = (a=&gt;0,b=&gt;4,c=&gt;10);<br>
то есть объект a имеет индекс 0, объект b имеет индекс 4, с имеет 10<br>
номер сортировки от 0 до 10<br>
<br>
есть ещё один объект.<br>
$s = (d=&gt;1);<br>
Его нужно вставить в список, не нарушив предидущий порядок, и чтобы индексы<br>
не пересекались. Если порядки сортировки совпадают, то надо вставить перед<br>
элементом в списке.<br>
Поясню на примерах:<br>
<br>
# исходный &quot;массив&quot;<br>
%a = (a=&gt;0,b=&gt;4,c=&gt;10);<br>
$s = (d=&gt;1);<br>
# результат<br>
%b = (a=&gt;0,b=&gt;4,c=&gt;10, d=&gt;1); #все просто<br>
<br>
# исходный &quot;массив&quot;<br>
%a = (a=&gt;0,b=&gt;4,c=&gt;10);<br>
$s = (d=&gt;0);<br>
# результат<br>
%b = (d=&gt;0, a=&gt;1,b=&gt;4,c=&gt;10); #&quot;d&quot; встает на место &quot;a&quot;, а &quot;a&quot; двигается в<br>
право<br>
# если &quot;a&quot; занимает чьето место, то и она должна тот элемент подвинуть и<br>
т.д.<br>
<br>
<br>
# исходный &quot;массив&quot;<br>
%a = (a=&gt;0,b=&gt;4,c=&gt;10);<br>
$s = (d=&gt;10);<br>
# результат<br>
%b = (a=&gt;0,b=&gt;4,c=&gt;10, d=&gt;9); # у &quot;d&quot; уменьшается индекс<br>
# если &quot;d&quot; занимает чьето место, то должна тот элемент подвинуть и т.д.<br>
<br>
# исходный &quot;массив&quot;<br>
%a = (a=&gt;0,b=&gt;4,c=&gt;10);<br>
$s = (d=&gt;4);<br>
# результат<br>
%b = (a=&gt;0,b=&gt;5,c=&gt;10, d=&gt;4);<br>
# или такой<br>
%b = (a=&gt;0,b=&gt;4,c=&gt;10, d=&gt;3);<br>
# тут нет разницы куда встанет &quot;d&quot; на место &quot;b&quot; или перед ним<br>
<br>
Вот что то даже не приходит в голову с чего начать.<br>
В конечном итоге там список будет, а не хеш (я его для простоты нарисовал)<br>
типа такого<br>
@a = (<br>
        {<br>
                name =&gt; a,<br>
                sort =&gt; 0,<br>
        },<br>
        {<br>
                name =&gt; b,<br>
                sort =&gt; 4,<br>
        },<br>
        {<br>
                name =&gt; c,<br>
                sort =&gt; 10,<br>
        },<br>
 );<br>
Может есть что то стандартное для этих целей? Или мысль кто подкинет<br>
полезную :)<br>
<br>
------<br>
С Уважением, Олег Малёваный<br>
<div><div></div><div class="h5"><br>
<br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Andrei Protasovitski<br>&lt; andrei[dot]protasovitski[at]gmail[dot]com &gt;<br>Diemen, Netherlands<br>