![]() |
|
||||||||||
|
|||||
|
Регистрация: Feb 2011
Сообщений: 100
|
У меня массив из элементов, каждый элемент это набор объект+строка+функция. Каждый элемент уникален. Мне надо быстро искать в этом массиве индекс нужного элемента, удалять/добавлять элементы и перебирать их все. Есть загвоздка с поиском.
В общем мне надо, чтобы код, вроде этого, в конце находил требуемый элемент и возвращал его индекс(сейчас он возвращает -1): class Elem { public var s: EventDispatcher; public var t: String; public var f: Function; public function ListenerElem(s: EventDispatcher, t: String, f: Function) { this.s = s; this.t = t; this.f = f; } } function someFunction1(e: Event): void { } var array: Vectror.<Elem> = new Vectror.<Elem>(); var ed: EventDispatcher = new EventDispatcher(); array.push(new Elem(ed, 'e1', someFunction1)); array.push(new Elem(ed, 'e2', someFunction1)); var index = array.indexOf(new Elem(ed, 'e2', someFunction1)) |
|
|||||
|
Вы ищете новосозданный элемент, которого нет в массиве.
как вариант создать словарик.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
|
Регистрация: Feb 2011
Сообщений: 100
|
Мне надо найти элемент, у которого все три поля совпадают. Строковые значения при этом могут быть одинаковыми, а поля с функцифми разные. Или поля с объектами разные, а поля с функцией и строкой одинаковые. Т.е. ключ словаря в моём случае - это уникальная комбинация объект+строка+функция. Вот как такое сделать?
|
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Цитата:
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
|
В AS3 нет перегрузки операторов. Может все таки пробежаться по вектору?
function getIndexOf(vector: Vector.<Elem>, value: Elem):int { if (vector && value) { var e: Elem; for (var i:int=0;i<vector.length;++i) { e = vector[i]; if (e && e.s == value.s && e.t == value.t && s.f == value.f) { return i; } } } return -1; } var index: int = getIndexOf(array, new Elem(ed, 'e2', someFunction1)); Последний раз редактировалось Inet_PC; 22.08.2011 в 15:45. |
|
|||||
|
Регистрация: Feb 2011
Сообщений: 100
|
Цитата:
Inet_PC, оно сейчас так и написано, но ищу вариант красивее. Перегрузку как раз и искал, или что-то подобное. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Может, тройной ассоциативный массив? %)
Не, это тоже изврат, но остальное не лучше) Возможно у вас нет варианта красивее тупого перебора, если он не тормозит, то пусть. private var dictionaryObj:Dictionary = new Dictionary(); public function pushTriplet(obj:Object, str:String, fun:Object, index:int):void { if(dictionaryObj[obj] == null) { dictionaryObj[obj] = new Object(); dictionaryObj[obj][str] = new Dictionary(); dictionaryObj[obj][str][fun] = index; } else if(dictionaryObj[obj][str] == null) { dictionaryObj[obj][str] = new Dictionary(); dictionaryObj[obj][str][fun] = index; } else if(dictionaryObj[obj][str][fun] == null) { dictionaryObj[obj][str][fun] = index; } else {//index already exists, overwriting dictionaryObj[obj][str][fun] = index; } } public function getIndexByTriplet(obj:Object, str:String, fun:Object):int{ if(dictionaryObj[obj] && dictionaryObj[obj][str] && dictionaryObj[obj][str][fun] != null) { return dictionaryObj[obj][str][fun]; } else {//no index return -1; } } public function deleteIndexByTriplet(obj:Object, str:String, fun:Object):void { if(dictionaryObj[obj] && dictionaryObj[obj][str]) delete dictionaryObj[obj][str][fun]; //ещё можно добавить проверки на то, что dictionaryObj[obj][str] пуст, чтоб его мочить, но влом } //итерирование писать тоже влом, очевидно же =)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. Последний раз редактировалось -De-; 22.08.2011 в 22:55. |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:51. |
|
|
« Предыдущая тема | Следующая тема » |
|
|