On-line: PSP, гостей 0. Всего: 1 [подробнее..]
АвторСообщение





Пост N: 20
Зарегистрирован: 06.12.14
ссылка на сообщение  Отправлено: 12.08.15 12:16. Заголовок: сортировка двухмерного массива


Доброе время суток

Прошу помощи если у кого есть возможность и желание, у меня крыша уже начинает съезжать (

Есть двухмерный массив, в котором array[N,1] - путь, array[N,2] - позиция на своем уровне вложения в пути, array[N,3] - уровень вложения.
{{'/a', 1, 0 },{'/b', 3, 0 },{'/c', 2, 0 },{'/a/a', 2, 1 },{'/a/b', 1, 1 },{'/b/a', 1, 1 },{'/b/b', 2, 1 },{'/c/a', 2, 1 },{'/c/b', 1, 1 },{'/a/a/a', 3, 2 },{'/a/a/b', 2, 2 },{'/a/a/c', 1, 2 },{'/b/a/a', 1, 2 },{'/c/a/a', 1, 2 },{'/b/a/a/a/', 1, 3 }}

Требуется отсортировать согласно указанных позиций на каждом уровне/подуровне вложения с правильной выходной структурой.
Хотелось бы получить такой результат:
{'/a', 1, 0 }
{'/a/b', 1, 1 }
{'/a/a', 2, 1 }
{'/a/a/c', 1, 2 }
{'/a/a/b', 2, 2 }
{'/a/a/a', 3, 2 }
{'/c', 2, 0 }
{'/c/b', 1, 1 }
{'/c/a', 2, 1 }
{'/c/a/a', 1, 2 }
{'/b', 3, 0 }
{'/b/a', 1, 1 }
{'/b/a/a', 1, 2 }
{'/b/a/a/a/', 1, 3 }
{'/b/b', 2, 1 }

Сортировки asort()-ом с разными условиями и попытки описать свой сортировщик довели почти до истерики.
Смысл в том что позиция и алфавитная сортировка создают противоречия в условиях и не получается отсортировать именно как требуется.
HELP

P.S.
Свои варианты сортировки не указывал, но все строилось на 2 базовых вариантах:
asort( aTest,,, {|a,b| left( a[1], rat( '/', a[1] ) ) + str( a[2], 2 ) < left( b[1], rat( '/', b[1] ) ) + str( b[2], 2 ) } ) - сортирует уровень+порядок
и
asort( aFullList,,, {|a,b| a[1] + '/' < b[1] + '/' } ) - сортирует по алфавиту согласно структуре

оба варианта пытался обвязать расширенными условиями в кодоблоке и нефига ( отсортировать в нужном порядке с сохранением структу не вышло


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 5 [только новые]





Пост N: 143
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 12.08.15 15:58. Заголовок: массив - в таблицу, индекс и обратно


Записываете массив в таблицу с тремя полями ar1 ar2 ar3
потом индекс - что-то типа f(ar1)+str(ar2,2)+str(ar3,2) , где f - Ваша нужная функция
ну и отсортированную таблицу по индексу - обратно в массив


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3332
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 12.08.15 16:13. Заголовок: КМК, задача неразреш..


КМК, задача неразрешима средствами ASORT. Если я правильно понял саму задачу.
Возьмем 2 элемента:

{'/c/b', 1, 1 }
и
{'/b/a', 1, 1 }

почему 1-й элемент меньше 2-го ?
Потому, что
{'/c', 2, 0 } < {'/b', 3, 0 }
То есть, для сравнения первых 2-х элементов недостаточно информации, в них содержащейся. Нужно еще брать информацию из элементов предыдущего уровня. А ASORT ее не даст.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 476
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.08.15 17:11. Заголовок: finder пишет: Хотел..


finder пишет:

 цитата:
Хотелось бы получить такой результат:
{'/a', 1, 0 }
{'/a/b', 1, 1 }
{'/a/a', 2, 1 }
{'/a/a/c', 1, 2 }
{'/a/a/b', 2, 2 }
{'/a/a/a', 3, 2 }



Прямое противоречие:

сначала а
потом ab
потом aa

или:
сначала aa
потом aac
потом aab
потом aaa

Это уже и не сортировка, а перестановка согласно неких внутренних условий. Я-бы сделал функцию, которая возвращает "вес" трех элементов массива {строка, число, число}.

Например:

FUNC MyFunc(aDim)
LOCAL cResult

cResult := PADR(CHARREM("\",aDim[1]),3) // строка вида "a ", "aab", "abb" и тп
cResult += STR(aDim[2])
cResult += STR(aDim[3])

RETURN cResult

Далее ASORT(aTest,,,{|a,b| MyFunc(a) < MyFunc(b)})

Если я не очень правильно уловил суть задачи - внутри MyFunc() легко все поправить. На выходе она должна давать четкий ответ, куда переставлять элементы массива.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1134
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 12.08.15 17:33. Заголовок: КМК ( (c) Pasha :) )..


КМК ( (c) Pasha :) ), можно сначала привести массив к древовидному, отсортировав каждую ветку как нужно (ведь тогда останется только одно условие для каждой ветки), а потом рекурсией собрать опять в двумерный.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 21
Зарегистрирован: 06.12.14
ссылка на сообщение  Отправлено: 13.08.15 13:01. Заголовок: Спасибо. Вы все под..


Спасибо.
Вы все подтвердили что простого решения нет, а то я уже переживать начал что мозги застыли.

В общем на данный момент остановился на таком варианте:
Скрытый текст


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


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 203
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет