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

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

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

Регистрация: Feb 2011
Сообщений: 100
По умолчанию Поиск объекта в массиве

У меня массив из элементов, каждый элемент это набор объект+строка+функция. Каждый элемент уникален. Мне надо быстро искать в этом массиве индекс нужного элемента, удалять/добавлять элементы и перебирать их все. Есть загвоздка с поиском.
В общем мне надо, чтобы код, вроде этого, в конце находил требуемый элемент и возвращал его индекс(сейчас он возвращает -1):
Код AS3:
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))
Перебор элементов в ручную я нехочу, может можно поменять поведение оператора == ?

Старый 21.08.2011, 21:59
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 2  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Вы ищете новосозданный элемент, которого нет в массиве.

как вариант создать словарик.
Код AS3:
var obj:Object = {};
obj['e1'] = new Elem(ed, 'e1', someFunction1);
obj['e2'] = new Elem(ed, 'e2', someFunction1);
array.push(obj['e1']);
array.push(obj['e2']);
 
var index:int = array.indexOf(obj['e2']);
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 22.08.2011, 12:12
botbot вне форума Посмотреть профиль Отправить личное сообщение для botbot Найти все сообщения от botbot
  № 3  
Ответить с цитированием
botbot

Регистрация: Feb 2011
Сообщений: 100
Мне надо найти элемент, у которого все три поля совпадают. Строковые значения при этом могут быть одинаковыми, а поля с функцифми разные. Или поля с объектами разные, а поля с функцией и строкой одинаковые. Т.е. ключ словаря в моём случае - это уникальная комбинация объект+строка+функция. Вот как такое сделать?

Старый 22.08.2011, 13:26
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 4  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Цитата:
Мне надо найти элемент, у которого все три поля совпадают. Строковые значения при этом могут быть одинаковыми, а поля с функцифми разные
Второе предложение противоречит первому. Определитесь уже, по какому критерию будут совпадения.

Старый 22.08.2011, 15:12
klafuda_klalafu вне форума Посмотреть профиль Отправить личное сообщение для klafuda_klalafu Найти все сообщения от klafuda_klalafu
  № 5  
Ответить с цитированием
klafuda_klalafu

Регистрация: Aug 2004
Адрес: N. Novgorod
Сообщений: 127
Отправить сообщение для klafuda_klalafu с помощью ICQ
а почему бы фильтр не использовать ?
filter()

Старый 22.08.2011, 15:38
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 6  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
В AS3 нет перегрузки операторов. Может все таки пробежаться по вектору?
Код 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.
Старый 22.08.2011, 20:07
botbot вне форума Посмотреть профиль Отправить личное сообщение для botbot Найти все сообщения от botbot
  № 7  
Ответить с цитированием
botbot

Регистрация: Feb 2011
Сообщений: 100
Цитата:
Сообщение от i.o. Посмотреть сообщение
Второе предложение противоречит первому. Определитесь уже, по какому критерию будут совпадения.
Прошу прощения, написал слитно две разных мысли. Надо найти элемент, у которого все три поля совпадают с заданными. В массиве лежат элементы с уникальными наборами объект+строка+значение.
Inet_PC, оно сейчас так и написано, но ищу вариант красивее. Перегрузку как раз и искал, или что-то подобное.

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

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Может, тройной ассоциативный массив? %)
Не, это тоже изврат, но остальное не лучше) Возможно у вас нет варианта красивее тупого перебора, если он не тормозит, то пусть.
Код AS3:
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.
Старый 22.08.2011, 22:45
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 9  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Вариант -De- конечно же имеет место быть, но я бы не стал использовать такое в своем проекте. В общем мну не понятно ради чего это...

Старый 22.08.2011, 23:40
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 10  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Может задача, которая породила эту по другому решается? Зачем вам такой поиск и хитрые непонятные объекты?
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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