Недавно на большом проекте осознал, что могу сократить кучу кода за счет использования появившегося в AS3 класса Dictionary (уже давно, позор мне, мне же известного ;-) Было:
function tileIsRendered(theTile:MapTile):Boolean { var result:Boolean; var aTile:MapTile; for each(aTile in renderedTiles) { if(aTile == theTile) { result = true; break; } } return result }
function tileIsRendered(theTile:MapTile):Boolean { return renderedTiles[theTile] == true }
Если вы не в курсе: Dictionary—это подобие ассоциативного массива, но его ключами можно назначать не только строки, но и объекты любого типа. Ключи объекта Dictionary работают как ссылки на объекты. Осталось проверить, насколько этот способ быстре вычислительно.
век живи - век учись!
способ естественно быстрее, но ресурсоёмчее(в теории памяти больше жрать будет на объект Dictionary) )
Я сейчас как раз тоже начал этот Класс использовать, кстате как раз для хранения тайлов:)
Dictionary - это, бесспорно, очень полезный класс. Правда иногда забываешь о его существовании и решаешь задачу массивами или объектами. Спасибо, что напомнил о нем. =)
Я немного не в теме Flash-а, но IMHO ключ хэша с типом отличным от строки в приведенном примере вам не нужен.
А Вадим діло говорить, чому це в тебе в об'єкті типу Dictionary 'renderedTiles' kлюч хеша є типу Tile? Здається можна було б обійтись і
function tileIsRendered(theTile:MapTile):Boolean {
return renderedTiles[theTile.id] == true
}
Вообще незаменимый класс для ассоциированного хранения данных. На нём сделали и "список" (по сути тот же "словарь", где ключ равен значению). По скорости неахти, так что злоупотреблять не советую.
var o:Object = new Object(); var a:Object = new Object(); a.toString = function():String { return "It's me"; } o[a] = true; o[true] = a; trace(o[a]+',',o[true]);
Vadim Voituk™, JabbyPanda™ - да, вы правы. Честно говоря, в примере - не реальный код из проекта, а просто первая иллюстрация, пришедшая мне в голову. И она не самая удачная из возможных :)
Поэтому возникает желание: давайте подберем самые лучшие (желательно простые) примеры использования Dictionary?
Один вариант, который я сейчас могу вспомнить: Когда мы имеем дело с "чужим и запечатанным" классом, который не поддерживает свойство ID. Тогда мы можем использовать Dictionary для имитации такого свойства у класса, изначально его не поддрживающего, передавая экземпляры класса как ключи Словаря, и присваивая им значения ID.
Но я хочу еще примеров.
Спасибо за чоткие комменты! :)
__etc™ - спасибо хакерам :)
С динамическими классами все клево; но ведь может быть и такая ситуация:
var o:Shape = new Shape(); var a:Shape = new Shape(); ...
Да ладно, это шутка была =) Объект не заменит Dictionary =)
Что касается Dictionary, то мне нужно было удалять и добавлять элементы в него без поиска . И так, чтобы не было двух одинаковых ссылок на один и тот же объект.
В одном проекте пришлось отказаться от Dictionary в пользу двух массивов т.к. перебор двух массивов намного быстрее чем перебор одного Dictionary. За то, если нужно просто достать зеначение по не строковому ключу, то Dictionary не в пример быстрее.
Тоже отказался от Dictionary в угоду скорости поиска данных.
Предыдущий пост
Следующий пост