![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2010
Сообщений: 137
|
Возник вопрос - что, в ActionScript3 API нет нормальной реализации словаря?
Из стандартных решений (ActionScript3 Common Collections не в счёт, это сторонняя разработка) я нашёл возможность задания словаря только через Object и Dictionary (смотрел в документации, собственно, и немного по форумам). Использовать их как-то не особо охота - у них, мягко говоря, не очень дружественный интерфейс. Чего только удаление элементов через delete стоит и тот факт, что если попытаться в качестве ключа использовать что-нибудь кроме строки, он вообще некорректно работает. Последний раз редактировалось semenyakinVS; 11.01.2013 в 19:52. |
|
|||||
|
[+1 22.04.13]
[+1 06.03.13] Регистрация: Apr 2012
Сообщений: 239
|
Dictionary
|
|
|||||
|
Нормальной реализации как в других языках нет, увы.
Цитата:
gagaga, читайте тему внимательнее, перед тем как отвечать. |
|
|||||
|
Регистрация: Mar 2010
Сообщений: 137
|
Цитата:
var theDictionary:Object = new Object(); var theMovie1:MovieClip = new MovieClip(); var theMovie2:MovieClip = new MovieClip(); theDictionary[theMovie1] = "first movie"; theDictionary[theMovie2] = "second movie"; trace(theDictionary[theMovie1]); trace(theDictionary[theMovie2]); second movie second movie Цитата:
|
|
|||||
|
Цитата:
Цитата:
А так: Работать будет. |
|
|||||
|
Только надо помнить что это AS3 и простое использование функции getX(i) уже снизит производительность раз в 5 по сравнению с простым доступом к элементу массива.
Так что сторонние либы есть смысл использовать только если коллекции действительно не могут сделать того что нужно, тут чем нативнее тем лучше. Нужен Set - заменяем Dictionary, как бы маразматически не выглядело set[x] = x или set[x] = true вместо set.Add(x). Но если нам нужно поддержание порядка в Set - тот тут ничего не попишешь - придется сочинять свои, нетривиальные вещи, чтобы это эффективно работало (ну или вот, по библиотекам шариться). |
|
|||||
|
Да построена поверх.
Но есть 2 интересных штуки: SortedList и SortedMap, которые Dictionary не заменишь никак (хотя сами его используют) плюс там где-то реализована сортировка слиянием - единственная широко известная _стабильная_ сортировка с временим O(n * lon n) (во флеш встроена какая-то нестабильная, возможно qsort) Т.е. полезная либа, не смотря на то что Set и StringSet там ничего толкового не делают - только работу замедляют. LinkedList в наивной (как там) реализации - тоже злое зло - начинает обгонять массив на произвольных удалениях и вставках только при очень больших значениях - а всё потому, что память без дела выделяется под Node. Тут нужно сам объект использовать как узел(добавить ему prev/next) - мы же всё равно память под него выделяем - тогда добавление в список не жрёт столько времени. Можно ещё с пулом нодов экспериментировать, тогда список начнёт обгонять массив пораньше. Можно ещё раскладывать линкованный список в массиве (ну как кучу раскладывают в массив - можно разложить и список, тогда при удалении объекта просто перебиваются значения-индексы в паре мест этого массива, запоминается пустое место (запоминается в конце того же массива для последующего добавления элемента в дырку) а не двигается всё что было после этого элемента) Но начинает обгонять простой массив на случайных вставках на числах > 100, на 10000 элементов было только в 8 раз быстрее. Вдобавок написание такого списка немного выносит мозг. Последний раз редактировалось expl; 11.01.2013 в 20:54. |
|
|||||
|
Modus ponens
|
Код по ссылке - ну не совсем бесполезный, конечно, но оставляет желать много лучшего по следующим причинам:
1. писатели пытались скопировать устройство из Явы, и поэтому написали много дурацкого и / или бесполезного кода. 2. писатели не знали, как на самом деле должны работать те или иные вещи (например, списки у них добавляют в конец, а не в начало). 3. в библиотеке нет даже необходимого минимума для работы с коллекциями, типа сортировки, поиска, удаления, конкатенации и т.п. Поскольку п. 1. то людям не пришло в голову использовать функции высшего порядка для реализации таких идей. В общем случае код плохо расширяемый / бессистемный. Но так чтобы сказать "не используйте это, потому, что есть лучше" - увы, я не в курсе про "лучше", мне не попадалось. Из практических соображений (т.е. скорость работы / тривиальность подавляющего большинства задач, которые приходится решать), отсутствие менее тривиальных коллекций очень редко когда сильно мешало. Кроме всего прочего, стоит заметить очень наивные реализации всего, что там заявлено и плохое понимание основ AS3. Например: public function nextKey(key : *) : * { var node : SortedMapNode = getNode(key); if (node) { node = nextNode_internal(node) as SortedMapNode; if (node) return node.key; } // a function returns undefined, unless otherwise specified. return undefined; } public function add(key : *, item : *) : Boolean { if (key is String) { // should be `key in _stringMap' instead. // keys are allowed to be undefined, but this doesn't // mean they aren't in the hash-table. if (_stringMap[key] !== undefined) return false; } else { if (_keys[key] !== undefined) return false; } addNode(new SortedMapNode(key, item)); return true; }
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 11.01.2013 в 21:00. |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:30. |
|
|
« Предыдущая тема | Следующая тема » |
|
|