![]() |
работа с изменяющимися массивами
Здравствуйте.
есть такая задача. на вход флешки из внешней программы поступаем строка значений объекта вида: 1,1,200,250;0,2,600,300;2,22,100,500; где первое значение - это тип объекта второе значение - ID объекта третье значение - координата Х четвертое значение - координата Y. я эту строку при помощи .split(";") загоняю в массив потом пробегаю по этому массиву и расставляю соответствующие типы в нужные координаты, добавляя на сцену при помощи addChild(нужный тип) но стока значений периодически меняется - и значения в ней тоже могут быть разными. каким образом отследить что оставить на сцене, что удалить и что добавить на мой взгляд - это нужно как то выделять все в разные массивы, но мне не совсем понятно как потом удалить нужный объект со сцены и как оставить на сцене те объекты, которые остались в строке значений. ломаю голову - уже закипел. может кто то подскажет направление |
Ну вы как-то храните айдишники того, что у вас на сцене. Тогда обьекты с новыми айдишниками - добавить, со старыми - оставить, каких нет - удалить. В чём проблема?
|
Самый простой вариант (но не самый лучший) - удалить ВСЁ и заново добавить из нового массива
|
re: leofit
в том то и дело что удалять все не надо. те объекты, ID которых сново есть в строке значений должны бить оставлены. re: -De- я не совсем могу понять как это мне сделать. сравнить две строки, значения которые совпали пометить в массив - оставить. а как потом выделить объекты которые надо удалить и те что добавить. плюс как удалить объект, если его ID и индекс при добавлении через addChild могу не совпадать |
При добавлении добавляйте объекты в хэш (Object), при получении строки проверяйте, есть ли объект такого типа (ну или какой там у вас параметр является уникальным) в хэше, просто передвигаете его, если нет создаете новый и добавляете в словарь. Все типы (непосредственно строка которая обозначает тип) которые есть в полученных значениях складываете попутно в другой хэш (временный). После того как все значения будут обработаны, зачишаете основной хэш: проходитесь по основному хешу и если в нем попадается тип, которого нет во временном хэше, убираете объект такого типа из списка отображения и удаляете его из хэша.
|
Ну сделать подумав мозжечком и такой-то матерью три набора айдишников, один - новые из массива, второй - старые, которые на сцене, третий - все, какие есть. Для всех айдишников из 3-го: если айдишник есть в 1-м, но нет во 2-м, то что делаем? если есть во 2-м, но нет в 1-м, то что делаем? если есть в 1-м и втором, то что делаем? Если нет ни в 1-м ни во 2-м, то стреляемся, т.к. не понятно, как он тогда попал в 3-й.
Хранить соответствие ID-обьект, индекс обьекта в дисплей листе - часто ненадёжное число, удалять не по индексу, а по обьекту, removeChild(objByID[ID]) Собсно надо уметь использовать Object и цикл for(var key:String in myObject) по нему. Хотя можно и на массивах. |
Например так:
1) После прихода первой строки у нас формируется массив объектов вида {type:0 , id:23 , _x:150 , y:75 , rest:false} 2) Когда приходит новая строка, мы получаем из нее массив объектов вида {type:0 , id:23 , _x:150 , y:75} 3) Проверяем по id, присутствуют ли элементы из нового массива в старом. Если элемент присутствует, смотрим, нужно ли изменить его координаты и устанавливаем значение rest в true. Если элемента с таким id нет, то добавляем его в массив и опять-таки устанавливаем rest в true. 4) После перебора всех элементов второго массива, проходимся по первому массиву и удаляем все элементы, у которых rest == false. P.S. Перед перебором очередной пришедшей строки, у всех элементов массива, разумеется, свойство rest нужно сбрасывать на false. |
Думаю, что в данной ситуации в самый раз будет применение Dictionary вместо Array, Vector или Object
|
Как раз в данной ситуации Dictionary не удобен, ввиду того, что у него в качестве ключа выступают объекты вместо id
|
Что-то типа
Код AS3:
Код AS3:
|
re -De-
подскажи пожалуйста - как добавлять объекты в дерево DisplayObject и сохранять соответствие этого объекта и его id |
Я это примерно так вижу:
Код AS3:
|
Добавлять с помощью addChild.
сохранять соответствие типа Код AS3:
Код AS3:
|
Не Array и не Vector, т.к. проще обратиться по имени, чем перебирать все элементы до поиска нужного.
Почему не Object - мне кажется, что Dictionary более специфичен для указанной задачи. Тут, собственно, нет уверенности, скорее личное предпочтение. К тому же Object использует в качестве ключа исключительно строку и возможность использования слабых ссылок. Если есть другие аргументы - было бы интересно. |
Цитата:
|
А Array/Vector - это в некотором роде числовой мап, а айдишник у нас что? Кстати, операция узнавания значения массива по индексу - она быстрее всех этих ваших хешэй (я, кстати, думаю, что индусы там дерево хорошо если сбалансированное сделали, а не хэш). Ну у него минусы, в общем, если индекс большой, то и массив большой. Хотя есть подозрение, что таки Array он на самом деле не массив, а мап и он память вроде не жрёт тоннами, если завести в нём 1 эл-т с номером 100000000.
Dictionary лучше рассматривать как ссылочный мап, т.е. ключ - ссылка, хотя он допилен до общего мапа. Потому он тяжелей. Установка использования слабых ссылок, кстати, просто не работает для тех эл-тов Dictionary, где ключ - "простой" обьект (на ваше счастье, потому что GC иначе сожрал бы связь). |
Цитата:
Добавлено через 7 минут Разница в скорости тоже не особо впечатляет: http://jacksondunstan.com/articles/855 60мс на 1000000 операций, можно не принимать в расчет. |
А что такое мап?
Код AS3:
Цитата:
Цитата:
Цитата:
|
-De-, Вы знаете как массивы хранятся в флеш плеере? Я не знаю. Догадки тут неуместны - если говорить о лоу-левеле за ширмой abc кода, то и говорить о нём. Короче, программиста не должны волновать низкоуровневые особенности кода, в который он транслируется.
Мы имеем что имеем. Array можно рассматривать как надежный массив (вектор) указателей, с оговорками к простым типам. Vector - аналогично. Только оно нам надо? Меня как-то не очень волнует какой технологией реализуется что-то нативное. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Т.е. в данном случае, что Dictionary, что Object - один хрен?
Цитата:
|
Цитата:
"1" "1" - по идее, это 2 разных объекта. Но почему то он ведёт себя как один в контексте Dictionary мне неясно. UPD: хотя, я, кстати, погорячился причем сильно. "1"==="1", а очевидно что если взять значение от одного ключа два раза - оно совпадёт. Так что всё вполне понятно. Например, здесь: http://ru.wikipedia.org/wiki/%D0%A5%...B8%D1%86%D0%B0 Цитата:
|
Цитата:
Мап (map) в данном случае переводится как "ассоциативный массив", ну или отображение. Хэш (hash table, hash map) - один из алгоритмов его реализации. Как работают слабые ссылки у Dictionary можно понять самому, написав примерчик, типа этого (правда только для дебаг плеера работает, для обычного чуть сложнее будет). Код AS3:
|
О боже. Простой тип может существовать только в связке со сложным (ну или статикой, но класс тоже можно считать сложным типом), причем он не может никуда ссылаться. Он просто есть в данном месте. И если это данное место удалить - то удалится и простой тип.
Цитата:
Конкретно у меня когда нужен объектный хэш - используется диктионари, когда строковой - обджект, чего и Вам желаю. Поэтому кто сколько "жрёт" меня не волнует - я использую инструмент там, где надо. А разницу в памяти между Obect и Dictionary юзер и не заметит - на утечках фп улетит куда больше. |
-De-, спасибо за пример, наглядно и доступно.
Цитата:
Самому сейчас нет желания тест скорости писать, может у кого есть ссылка по теме? Помню как-то видел, только не помню где. |
Код AS3:
Поздравляю, Вы спасли 8 байт. UPD: хотя, не 8, может чуть больше, возможно эти 8 байт - 2 ссылки, которые getSize считает по 4 байта. Но я думаю мысль ясна. Добавлено через 44 секунды Цитата:
|
Цитата:
Я про то, что такие "низкоуровневые особенности кода" могут таки делать хорошую разницу =) Если Array - ассоциативный массив на самом деле, то для того, чтобы поиметь элемент с индексом в 1000000000 ему таки меньше памяти понадобится, чем если он обычный массив. =) |
Теоретики, блин :) хоть кто-то из вас тест по ссылке смотрел?
60мс на 1000000 итераций это для вас хорошая разница? |
Цитата:
Цитата:
Цитата:
Код AS3:
Код AS3:
Код:
2020И бить по пальцам тех, кто забивает в массивы значения не с 0. Во всяком случае тех, кто специально. |
Psycho Tiger, попробуй так:
Код AS3:
|
И правда, забавно, спасибо. Видимо, это издержки, что > 0 работает быстрее, чем насильно конвертировать в Boolean. Однако, суть теста не меняется )
|
Я еще читал, что флеш отнимает медленнее, так что теоретически возможно, что разница стремится к 0.
|
Цитата:
|
разница в скорости для ситуации, описанной в 28м посте
|
Нет. Разница есть, и почти в 4 раза.
|
Цитата:
|
спасибо всем за комменты. это все помогло в итоге разобраться в проблеме.
|
Цитата:
|
И что это меняет? (с)
|
Цитата:
Вы спросили - я ответил ) |
Цитата:
Код AS3:
|
| Часовой пояс GMT +4, время: 18:12. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.