PDA

Просмотр полной версии : Определение индекса в многомерных массивах.


Chum
05.03.2013, 20:33
Погуглил, не нашёл ответа, решил спросить.
У каждого элемента массива есть свойство indexOf, обратившись к которому можно определить его индекс.
Вопрос: как можно определить все иерархические индексы данного элемента в многомерном массиве, н.п для трёхмерного массива.

mikhailk
05.03.2013, 20:35
Перебором?
Перебором всех уровней, кроме нижнего.

Chum
05.03.2013, 20:36
Ой как не хоца перебором!

mikhailk
05.03.2013, 20:37
Тогда пересмотреть структуру данных.
Зачем многомерный массив?
Тем более, что он не многомерный, а массив массивов массивов?

gloomyBrain
05.03.2013, 21:14
Стоит упомянуть, что массив любой размерности легко и непринужденно превращается в одномерный массив. Немного школьной математики и дело в шляпе.


Ой как не хоца перебором!

А как по-Вашему работает indexOf()? =) Именно перебором от начала до конца. Хотите двоичный поиск или еще какую-то эвристику - пишите сами.

Chum
05.03.2013, 21:18
В зависимости от поставленной задачи, превращение многомерного массива в одномерный не всегда является лучшим решением. Лучше уж перебор.

iflamberg
05.03.2013, 21:21
Организовать хеш-таблицу?

mikhailk
05.03.2013, 22:55
И, все-таки, надо идти от данных.
Трехмерные массивы сами из ниоткуда не берутся.
Зачем они тут?

Chum
05.03.2013, 23:24
Речь идёт о рисовании некоторых составных графических элеменов, которых можно несколько создать на одной плоскости, а плоскостей тоже может быть несколько. Данные по одному такому составному элементу - массив, описание всех элементов на одной плоскости - двумерный массив, а по всем плоскостям - трёхмерный. Вот такая общая структура получается. Нет, ну пересортировать трёхмерный массив дело не очень сложное, просто создавая эту тему я думал что можно будет сделать как-нибудь попроще.

mikhailk
05.03.2013, 23:50
Ну, в порядке бреда можно пойти от обратного. :)

objArray - массив объектов
indexArray - массив индексов

Создаем объект и кладем его в массив objArray, потом берем его индекс в этом массиве (objIndex) и в массиве indexArray прописываем его параметры i,j,k (в трехмерном массиве они были индексами):

indexArray[objIndex] = { i:111, j:222, k:333 };

Тогда в любой момент времени:

indexArray[objArray.indexOf(obj)].i
indexArray[objArray.indexOf(obj)].j
indexArray[objArray.indexOf(obj)].k

Chum
06.03.2013, 00:21
Спасибо мысль понятна, но в моём случае наверно это не пройдёт потому как особенно элементы третьего уровня могут менять свои индексы, вообще удаляться, добавляться новые. Это может вызвать такую чехарду, лучше уж перебором выходить на него, кликнутого и давать ему команды.

mikhailk
06.03.2013, 00:36
На самом деле, перебор - это не так страшно.

Vreden
06.03.2013, 00:40
Такие сложные массивы - плохо.
[0][3][2] - плохо. Как было сказано выше, лучше пересмотреть структуру данных и сделать для первого уровня массива [0] специальный тип, который описывает вложенные уровни [3][2]. И тогда у вас будет одномерный массив или вектор этих специальных типов. (Специальный тип может также описывать массив, который хранит специальный тип для следующего вложенного уровня и т.д.)

И принципы ООП соблюдены, и ежу понятен код будет, а при виде [0][3][2] я начинаю жутко нервничать ;)

Sync
06.03.2013, 02:26
может деревья тут были бы выгоднее?

mikhailk
06.03.2013, 10:33
Кстати, я так и не понял, а зачем вообще эти массивы.

Речь идёт о рисовании некоторых составных графических элеменов, которых можно несколько создать на одной плоскости, а плоскостей тоже может быть несколько. Данные по одному такому составному элементу - массив, описание всех элементов на одной плоскости - двумерный массив, а по всем плоскостям - трёхмерный.

Если плоскость - это контейнер, то для обхода всех элементов на плоскости не нужен массив, в котором все элементы зарегистрированы. Достаточно обойти всех детей контейнера.

Если же мы ткнули в конкретный элемент, то он всегда знает своего родителя и родителя своего родителя.

Chum
06.03.2013, 11:43
Мысль хорошая, но я признаться мало работал именно с контейнерами, будем гуглить.

mikhailk
06.03.2013, 12:30
но я признаться мало работал именно с контейнерами




var panelContainer:Sprite = new Sprite(); // это контейнер

var element1:Element = new Element(); // это элемент
var element2:Element = new Element();
var element3:Element = new Element();

panelContainer.addChild(element1);
panelContainer.addChild(element2);
panelContainer.addChild(element3);

for(var i:int = 0; i < panelContainer.numChildren; i++)
{
if (panelContainer.getChildAt(i) as Element)
{
var element:Element = panelContainer.getChildAt(i) as Element;
// тут делаем с элементом, что нужно

trace(element, element.parent, element.parent.parent);
}
}

Chum
06.03.2013, 12:36
Спасибо, ситуация проясняется.

Добавлено через 22 часа 26 минут
Второй день бьюсь и понимаю что мало что проясняется, проблема не в понимании сути, а в незнании синтаксиса AS3. С одномерным контейнером все понятно, положил-выложил, делов-то! Требуется чёткое понимание принципа создания контейнеров разного уровня ну и управления ими: создал, добавил, удалил.
Вот примерно что требуется от предыдущего кода:
var panelContainer:Sprite = new Sprite(); // это контейнер
var element1:Sprite = new Sprite(); // это элемент
var element2:Sprite = new Sprite();
var element3:Sprite = new Sprite();

panelContainer.addChild(element1);
panelContainer.addChild(element2);
panelContainer.addChild(element3);
/* В контейнер panelContainer добавлено три потомка element1,2,3 теперь стоит задача добавить в эти потомки ещё объекты а потом в свою очередь добавить потомки в них */
/* Следующие элементы добавляются как дети в добавленные в panelContainer element1,2,3 */
var element1a:Sprite = new Sprite();
var element2a:Sprite = new Sprite();
var element3a:Sprite = new Sprite();
/* После всего этого добавить еще потомков по пути panelContainer->element1->element1a->element1a1 */
var element1a1:Sprite = new Sprite();
var element2a1:Sprite = new Sprite();
var element3a1:Sprite = new Sprite();
/* А так же хотелось бы понять как можно легко и непринуждённо управлять ими. */
for(var i:int = 0; i < panelContainer.numChildren; i++)
{
if (panelContainer.childAt(i) as Sprite)
{
var element:Sprite = panelContainer.getChildAt(i) as Sprite;
// тут делаем с элементом, что нужно

trace(element.name, element.parent, element.parent.parent, element.parent.parent.perent);
}
}
Если у кого-то есть ссылка на урок по синтаксису на похожую задачу - скиньте плиз.