Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.01.2013, 19:17
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 1  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
По умолчанию Словари в AS3 (не Dictionary)

Возник вопрос - что, в ActionScript3 API нет нормальной реализации словаря?

Из стандартных решений (ActionScript3 Common Collections не в счёт, это сторонняя разработка) я нашёл возможность задания словаря только через Object и Dictionary (смотрел в документации, собственно, и немного по форумам). Использовать их как-то не особо охота - у них, мягко говоря, не очень дружественный интерфейс. Чего только удаление элементов через delete стоит и тот факт, что если попытаться в качестве ключа использовать что-нибудь кроме строки, он вообще некорректно работает.


Последний раз редактировалось semenyakinVS; 11.01.2013 в 19:52.
Старый 11.01.2013, 19:21
gagaga вне форума Посмотреть профиль Отправить личное сообщение для gagaga Найти все сообщения от gagaga
  № 2  
Ответить с цитированием
gagaga
[+1 22.04.13]
[+1 06.03.13]

Регистрация: Apr 2012
Сообщений: 239
Dictionary

Старый 11.01.2013, 19:26
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 3  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Нормальной реализации как в других языках нет, увы.
Цитата:
что если попытаться в качестве ключа использовать что-нибудь кроме строки, он вообще некорректно работает.
Ниразу не неблюдал ничего подобного. Dictionary нормально работает и со сложными объектами в качестве ключа

gagaga, читайте тему внимательнее, перед тем как отвечать.

Старый 11.01.2013, 19:44
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 4  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
Цитата:
Ниразу не неблюдал ничего подобного.
Попробуйте выполнить вот такой код:
Код AS3:
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

Цитата:
gagaga, читайте тему внимательнее, перед тем как отвечать.
Я сам виноват. Тему назвал реально криво, а где переиминовать - не знаю.

Старый 11.01.2013, 19:46
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
а где переиминовать - не знаю.
изменить - расширеный режим и там должен быть заголовок
Цитата:
Попробуйте выполнить вот такой код:
Код AS3:
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]);
Ну само собой. Object не умеет использовать сложные объекты как ключи.
А так:
Код AS3:
var theDictionary:Dictionary = new Dictionary();
var theMovie1:MovieClip = new MovieClip();
var theMovie2:MovieClip = new MovieClip();
 
theDictionary[theMovie1] = "first movie";
theDictionary[theMovie2] = "second movie";
 
trace(theDictionary[theMovie1]);
trace(theDictionary[theMovie2]);
Работать будет.

Старый 11.01.2013, 19:54
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 6  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
Спасибо! Действительно работает. Но всё-таки API не очень приятное.

Хочу как-нибудь попробовать то, что вот тут

Старый 11.01.2013, 20:06
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 7  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Только надо помнить что это AS3 и простое использование функции getX(i) уже снизит производительность раз в 5 по сравнению с простым доступом к элементу массива.
Так что сторонние либы есть смысл использовать только если коллекции действительно не могут сделать того что нужно, тут чем нативнее тем лучше.

Нужен Set - заменяем Dictionary, как бы маразматически не выглядело set[x] = x или set[x] = true вместо set.Add(x).
Но если нам нужно поддержание порядка в Set - тот тут ничего не попишешь - придется сочинять свои, нетривиальные вещи, чтобы это эффективно работало (ну или вот, по библиотекам шариться).

Старый 11.01.2013, 20:29
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Хочу как-нибудь попробовать то, что вот тут
Не могу утверждать, так как не смотрел, но что-то мне подсказывает, что эта либа так же построена поверх Dictionary и Object

Старый 11.01.2013, 20:38
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 9  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Да построена поверх.
Но есть 2 интересных штуки: SortedList и SortedMap, которые Dictionary не заменишь никак (хотя сами его используют)
плюс там где-то реализована сортировка слиянием - единственная широко известная _стабильная_ сортировка с временим O(n * lon n) (во флеш встроена какая-то нестабильная, возможно qsort)
Т.е. полезная либа, не смотря на то что Set и StringSet там ничего толкового не делают - только работу замедляют.

LinkedList в наивной (как там) реализации - тоже злое зло - начинает обгонять массив на произвольных удалениях и вставках только при очень больших значениях - а всё потому, что память без дела выделяется под Node.

Тут нужно сам объект использовать как узел(добавить ему prev/next) - мы же всё равно память под него выделяем - тогда добавление в список не жрёт столько времени.

Можно ещё с пулом нодов экспериментировать, тогда список начнёт обгонять массив пораньше.

Можно ещё раскладывать линкованный список в массиве (ну как кучу раскладывают в массив - можно разложить и список, тогда при удалении объекта просто перебиваются значения-индексы в паре мест этого массива, запоминается пустое место (запоминается в конце того же массива для последующего добавления элемента в дырку) а не двигается всё что было после этого элемента)
Но начинает обгонять простой массив на случайных вставках на числах > 100, на 10000 элементов было только в 8 раз быстрее. Вдобавок написание такого списка немного выносит мозг.


Последний раз редактировалось expl; 11.01.2013 в 20:54.
Старый 11.01.2013, 20:45
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код по ссылке - ну не совсем бесполезный, конечно, но оставляет желать много лучшего по следующим причинам:
1. писатели пытались скопировать устройство из Явы, и поэтому написали много дурацкого и / или бесполезного кода.
2. писатели не знали, как на самом деле должны работать те или иные вещи (например, списки у них добавляют в конец, а не в начало).
3. в библиотеке нет даже необходимого минимума для работы с коллекциями, типа сортировки, поиска, удаления, конкатенации и т.п. Поскольку п. 1. то людям не пришло в голову использовать функции высшего порядка для реализации таких идей. В общем случае код плохо расширяемый / бессистемный.

Но так чтобы сказать "не используйте это, потому, что есть лучше" - увы, я не в курсе про "лучше", мне не попадалось. Из практических соображений (т.е. скорость работы / тривиальность подавляющего большинства задач, которые приходится решать), отсутствие менее тривиальных коллекций очень редко когда сильно мешало.

Кроме всего прочего, стоит заметить очень наивные реализации всего, что там заявлено и плохое понимание основ AS3. Например:

Код 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;
}
комментарии мои.

Код AS3:
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, время: 15:09.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:09.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.