![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 26
|
Ув. Flash/Flex программисты нужно решить задачу, если у кого есть готовое решение не откажусь.
Насколько я понимаю здесь нужно реализовать обход дерева, пока не найдем нужный DisplayObject... Я реализовал обход дерева, просто развернув его в Vector, но такой подход медленнее чем РЕКУРСИВНЫЙ. Да и РЕКУРСИВНЫЙ ПОДХОД ТОЖЕ НЕ КАТИТ(( Вот примерный прототип функции: public static DisplayObject searchByNameDO( o: DisplayObjectContainer, oname: String ): DisplayObject{ } |
|
|||||
|
надо бы уточнить ограничения, почему не катит рекурсия и т.п.
чем например такой (в лоб, без затей) не подходит ? public static function searchByNameDO(o:DisplayObjectContainer, oname:String):DisplayObject { for (var i:int = 0; i < o.numChildren; i++) { var child:DisplayObject = o.getChildAt(i); if (child.name == oname) { return child; }else if( child is DisplayObjectContainer) { return searchByNameDO(child as DisplayObjectContainer, oname); } } return null; } |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 26
|
Шеф сказал без Рекурсий(( Объяснил мне тем, что нужна скорость больше...
P.S. Согласись неопровержимый факт) |
|
|||||
|
Modus ponens
|
Вы столько дисплей объектов не сможете создать, чтобы заметить разницу в скорости работы.
Кроме того, у вас не получится оптимальное решение с циклом, т.как вы не сможете получить списки всех родителей и детей массивом, или какой-то структурой которая сама может запомнить последную позицию перед тем как вы сделали выбор брат/ребенок. Т.е. вам нужно будет куда-то записывать индекс последнего обработанного ребенка для каждого контейнера обрабоку которого вы еще не закончили (вместо того, чтобы хранить это все на стеке). Конечно, это тяжело говорить шефу, что он ошибается... но задача имеет геометрический смысл, только в случае если это какое-то тестовое задание. А так - глупость.
__________________
Hell is the possibility of sanity |
|
|||||
|
В порядке бреда:
Можно заносить всех детей в нужную вам структуру данных по Event.ADDED, ловящемся на контейнере (корне дерева), например. Если цепляется лист -- хорошо. Если цепляется поддерево -- его обходим рекурсивно, но это незначительно при малых поддеревьях.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 26
|
Спасибо, я понимаю что может рекурсия самый оптимальный вариант, но так-как я на испытательном сроке, то что-то доказывать шефу не стану((
Как я в самом начале пытался делать: getChildByName(name:String) isplayObjectВозвращает экземпляр дочернего экранного объекта с заданным именем. 1. Прогоняю корень через getChildByName, если результата нет. 2. Иду вниз по всем детям пока не найду нужный либо дерево не закончиться. !!! Но в процессе реализации запутался очень с тим ДЕРЕВОМ, удалил весь код и написал развертку дерева в Vector и после пробегал по вектору getChildByName-ом. Мне шеф "забанил" работу с вектором, подскажите оптимальный алгоритм пробега по n-арному дереву. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 150
|
public static function searchByNameDO(owner: DisplayObjectContainer, name: String): DisplayObject { var stackContainers:Vector.<DisplayObjectContainer> = new Vector.<DisplayObjectContainer>(); var stackIdx:Vector.<int> = new Vector.<int>(); var currContainer:DisplayObjectContainer = owner; var idx:int = 0; while (currContainer != null) { var result:DisplayObject = currContainer.getChildByName(name); if (result != null) return null; while (idx < currContainer.numChildren) { var container:DisplayObjectContainer = currContainer.getChildAt(i) as DisplayObjectContainer; if (container != null) { stackContainers.push(currContainer); stackIdx.push(idx); currContainer = container; idx = 0; break; } idx++; } currContainer = stackContainers.pop(); idx = stackIdx.pop(); } } Добавлено через 7 минут Цитата:
public static function searchByNameDO(container: DisplayObjectContainer, name: String): DisplayObject { var result:DisplayObject = container.getChildByName(name); if (result != null) return null; for (var i:int = 0; i<container.numChildren; i++) { var childContainer:DisplayObjectContainer = container.getChildAt(i) as DisplayObjectContainer; if (childContainer != null) { result = searchByNameDO(childContainer); if (result != null) return result; } } return null; } Последний раз редактировалось Stitch512; 29.01.2012 в 21:15. |
|
|||||
|
Насколько часто у вас меняется display list?
Добавлено через 2 минуты Ну и смысл задачи не ясен. Вам надо найти все DO с определенным именем или только первый.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 26
|
Насчет изменений дисплей листа меня не уведомили, но завтра на месте спрошу. Думаю смысл задачи вернуть хотя-бы первый попавшийся объект с заданным именем, без использования РЕКУРСИИ. Буду благодарен за любые варианты решений!)
Добавлено через 1 час 5 минут Ув. Stitch512, у меня пару вопросов по исходнику, который не рекурсивный. public static function searchByNameDO(owner: DisplayObjectContainer, name: String): DisplayObject { var stackContainers:Vector.<DisplayObjectContainer> = new Vector.<DisplayObjectContainer>(); var stackIdx:Vector.<int> = new Vector.<int>(); var currContainer:DisplayObjectContainer = owner; var idx:int = 0; while (currContainer != null) { var result:DisplayObject = currContainer.getChildByName(name); if (result != null) return null;//ЗДЕСЬ return result; ??? while (idx < currContainer.numChildren) { var container:DisplayObjectContainer = currContainer.getChildAt(i) as DisplayObjectContainer; //ЗДЕСЬ вместо i - idx или просто наращивать i ниже? if (container != null) { stackContainers.push(currContainer); stackIdx.push(idx); currContainer = container; idx = 0; break; } idx++; } currContainer = stackContainers.pop();//Что здесь происходит? idx = stackIdx.pop();//Что здесь происходит? } return null; } Последний раз редактировалось Vitalya; 29.01.2012 в 22:58. |
|
|||||
|
Вот вам без рекурсии.
private const objectsMap:Object = {}; ... stage.addEventListener(Event.ADDED_TO_STAGE, stage_addedToStagehandler, true); stage.addEventListener(Event.REMOVED_FROM_STAGE, stage_removedToStagehandler, true); ... protected function stage_removedToStagehandler(event:Event):void { objectsMap[event.target.name] = event.target; } protected function stage_addedToStagehandler(event:Event):void { delete objectsMap[event.target.name]; } private function searchByName(name:String):DisplayObject { return objectsMap[name]; }
__________________
משיח לא בא משיח גם לא מטלפן |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:05. |
|
|
« Предыдущая тема | Следующая тема » |
|
|