PDA

Просмотр полной версии : Трехмерный массив с подобъектами


uglan
26.06.2008, 01:28
Доброго времени суток!
Подскажите, пожалуйста, как мне замутить трехмерный массивчик с вложенными объектами?
Пример(просто сам алгоритм):
a[0] = "aga";
a[0][0]="ugu";
a[0][1]="ugu2";
a[0][1][0].name = "ege";
a[0][1][0].num = 10;
a[0][1][0].txt = "bla bla bla";

при этом каким-то образом желательно получать объем каждого массива в отдельности. То есть a[].length = 1,a[][].length=2,a[][][].length=0.

p.s. Темно уже на улице, может и туплю чего не обессудьте))

MrPoma
26.06.2008, 02:25
Ну и в чем проблема?

Alex_beginner
26.06.2008, 11:29
Здравствуйте uglan!

Мне не совсем понятна целесообразность конструкций:

a[0] = "aga";
a[0][0]="ugu";
a[0][1]="ugu2";
a[0][1][0].name = "ege";
a[0][1][0].num = 10;
a[0][1][0].txt = "bla bla bla";

В особенности последние строчки.

А вообще многомерный массив можно создать с использованием литерала, пример:

var a:Array = [["aga","ugu"],["ege","uau","oh"]];

Причем обращение
a[0] будет ссылаться не на один единственный элемент массива, а на массив ["aga","ugu"] и поэтому присвоив a[0] = "aga" вы замените массив ["aga","ugu"] на "aga".

Теперь, если Вы хотите вложить объект (скажем инстанцию Object) в трехмерный массив лучше сделать это так:

a[0][0][0] = {name:"ege", num:10, txt:"bla bla bla"}

или так

a[0][0][0] = new Object();
a[0][0][0].name = "ege"
...
...

uglan
26.06.2008, 11:38
Проблема в том что даже двумерный массив такого вида ничего не возвращает:

var a=new Array();

a[0] = "aga";
trace(a[0]);
результат "aga"

a[0][0] = "ugu"
trace(a[0][0]);

результат undefined

a[0][0][0] = new Object();
a[0][0][0].name = "ege"

trace(a[0][0][0].name);
результат undefined

uglan
26.06.2008, 11:47
А подобный вид
var a:Array =new Array();

a[0] = "aga";
trace(a[0]);

a[[0],[0]] = "ugu"
trace(a[[0],[0]]+"/"+a[[0],[0]].length);

не корректно возвращает длинну вложенного массива. В данном случае 3. То же значение вернет trace(a[0].length);
-------------------------------------
Объясню для чего мне это нужно. Мне нужна некая трехуровневая структура иерархического типа в которой будут храниться данные. Причем класс на каждом уровне может быть разный.
Пример:

FirstLevel1(name - "FLevel1")
--SecondLevel1(name - "SLevel1")
----ThirdLevel1(name = "TLevel1",desc="desc TLevel1",index="1" и т.д.)
----ThirdLevel2(name = "TLevel1",desc="desc TLevel1",index="1" и т.д.)
----ThirdLevel3(name = "TLevel1",desc="desc TLevel1",index="1" и т.д.)
----ThirdLevel4(name = "TLevel1",desc="desc TLevel1",index="1" и т.д.)
--SecondLevel2(name - "SLevel2")
----ThirdLevel1(name = "TLevel1",desc="desc TLevel1",index="1" и т.д.)
----ThirdLevel2(name = "TLevel1",desc="desc TLevel1",index="1" и т.д.)
--SecondLevel2
--SecondLevel3

Структура создается динамически, поэтому изначально нельзя определить размер массива.

Alex_beginner
26.06.2008, 11:56
uglan! Вы поймите следущее. Если Вы создали массив это не значит, что в каждой ячейке его можно создать свойство и присвоить ему значение. Это можно сделать только после создания инстанции Object в ячеке массива.

Сделайте так:

в этом примере
a[0][0] = "ugu"
trace(a[0][0]);

поменяйте так:
var a:Array = [[],[]];
a[0][0] = "ugu"
trace(a[0][0])

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

uglan
26.06.2008, 12:00
А вот так не работает.
var a:Array = [[],[],[]];
a[0][0][0] = "ugu"
trace(a[0][0][0])
undefined

И опять таки вот такой код
var a:Array = [[],[]];
a[0][0] = "ugu"
trace(a[0][0].length);
Не возвращает нужного значения.

alexcon314
26.06.2008, 12:03
uglan, а почему вы не хотите использовать xml для хранения того, что вы называете
"трехуровневая структура иерархического типа "?

uglan
26.06.2008, 12:05
Мне кажется массив удобнее(без заморочки с кучей childNodes), если он вообще может работать с тройной структурой.

qazwsx
26.06.2008, 12:06
var a:Array = [];
a[0] = [];
a[0][0] = ':Q';
trace(a[0][0]);

qazwsx
26.06.2008, 12:09
Мне кажется массив удобнее(без заморочки с кучей childNodes), если он вообще может работать с тройной структурой.

Можно даже в строку твою трёх уровневую структуру записать :)

uglan
26.06.2008, 12:12
var a:Array = [];
a[0] = [];
a[0][0] = ':Q';
trace(a[0][0]);

А вот так не работает
var a:Array = [];
a[0] = [];
a[0][0] = 'AGA';
a[0][0][0] = []
a[0][0][0] = 'UGU';
trace(a[0][0][0]);

Alex_beginner
26.06.2008, 12:14
Что некорректно в этом коде?!

var arr:Array = [];
arr[0] = []
arr[0][0] = "ege"
arr[0][1] = "fgh"
trace(arr[0].length) //Выведет 2

Здесь без потери ранее записанных данных при изменении размерности массива не обойтись. Потому и не работает.
Нужно определить размерность массива заранее. А вот размер каждого измерения Вы можете создавать динамически.
var a:Array = [];
a[0] = [];
a[0][0] = 'AGA';
a[0][0][0] = []
a[0][0][0] = 'UGU';
trace(a[0][0][0]);

Давайте разберем этот код подробнее для понимания проблемы.

В первой строке Вы создаете одномерный массив a.
Во второй строке, Вы создаете второе измерение массива a
В третьей строке Вы присваиваете ячеке двумерного массива значение "АGA". Пока все вроде бы корректно.
В четвертой строке, Вы пытаетесь создать уже четвертое измерение минуя 3. Разумеется это невозможно. Поэтому, Вы вынуждены будете ячейку a[0][0] =="AGA" переопределить массивом создающим 3-е измерение. Разумеется "AGA" сохранено не будет.

var a:Array = [];
a[0] = [];
a[0][0] = 'AGA';
a[0][0] = []
a[0][0][0] = 'UGU';
trace(a[0][0][0]);//"AGA" больше не существует!!!

uglan
26.06.2008, 12:14
А вот так не работает:
var a:Array = [];
a[0][0][0] = [];
a[0][0][0] = ':Q';
trace(a[0][0][0]);

А вот так
var arr:Array = [];
arr[0] = []
arr[0] = "1"
arr[1] = "2"
arr[2] = "3"
arr[3] = "4"
arr[0][0] = "ege"
arr[0][1] = "fgh"
trace(arr[0].length)

Выведет 1...

Чтобы создать цикл мне нужно будет знать длину каждого уровня массива.
for(i=0;i<arr.length;++i){
for(u=0;u<arr[i].length;++u){
}
}
...

alexcon314
26.06.2008, 13:38
uglan, не надо постить несколько сообщений подряд. Пользуйтесь кнопкой "Изменить"

uglan
26.06.2008, 13:55
Давайте разберем этот код подробнее для понимания проблемы.

В первой строке Вы создаете одномерный массив a.
Во второй строке, Вы создаете второе измерение массива a
В третьей строке Вы присваиваете ячеке двумерного массива значение "АGA". Пока все вроде бы корректно.
В четвертой строке, Вы пытаетесь создать уже четвертое измерение минуя 3. Разумеется это невозможно. Поэтому, Вы вынуждены будете ячейку a[0][0] =="AGA" переопределить массивом создающим 3-е измерение. Разумеется "AGA" сохранено не будет.

var a:Array = [];
a[0] = [];
a[0][0] = 'AGA';
a[0][0] = []
a[0][0][0] = 'UGU';
trace(a[0][0][0]);//"AGA" больше не существует!!![/QUOTE]

Хорошо в таком случае как мне задействовать каждый уровень?
то есть чтобы значения хранились тут
a[0] = 1
a[1] = 1
и на других уровнях
a[0][0] = 2
a[0][1] = 2
a[0][2] = 2
a[1][0] = 2.1
a[1][1] = 2.2
a[1][2] = 2.1

и т.д.

Alex_beginner
26.06.2008, 13:59
uglan!

Давайте разберем и этот код.

arr[0] = []
arr[0] = "1"
arr[1] = "2"
arr[2] = "3"
arr[3] = "4"
arr[0][0] = "ege"
arr[0][1] = "fgh"
trace(arr[0].length)




В первой строке Вы создаете второе измерение не создав первое (ошибка).
В последующих четырех строках Вы записываете значения в 4 ячейки несуществующего одномерного массива.
А вот в третьей и четвертой пытаетесь присвоить значение не существующей ячейке несуществующего двумерного массива (массив arr на этот момент одномерный). Поэтому length выдает что попало (в данном случае 1).
Как на самом деле должен выглядеть этот код?!

Вот так:
arr = []
arr[0] = "1"
arr[1] = "2"
arr[2] = "3"
arr[3] = "4"
arr[0] = []; создаем пустой массив-измерение в ячейке [0]
arr[0][0] = "ege"
arr[0][1] = "fgh"
trace(arr[0].length)

Но! ячейка arr[0] будет переопределена вторым измерением.

Хорошо в таком случае как мне задействовать каждый уровень?
то есть чтобы значения хранились тут
a[0] = 1
a[1] = 1
и на других уровнях
a[0][0] = 2
a[0][1] = 2
a[0][2] = 2
a[1][0] = 2.1
a[1][1] = 2.2
a[1][2] = 2.1

Я уже говорил, что с размерностью (не путать с размером измерения) нужно сразу определиться. Давайте попробуем создать двухступенчатую иерархию вот так:


a = []
a[0] = 1;
a[1] = [];
a[1][0] = 2;
a[1][1] = [];
...


По аналогии можно создать любую иерархию.

terbooter
26.06.2008, 14:14
Во флеше нет трехмерных массивов.
Но можно использовать Массив массивов.

Конструкция вида

var zeroObject:Object = new Object();

var coordinats:Array= new Array();
coordinats[0] = new Array();
coordinats[0][0] = new Array();
coordinats[0][0][0] = zeroObject;
Лишь имитирует многомерный массив

Alex_beginner
26.06.2008, 14:20
Во флеше нет трехмерных массивов.

Если уж говорить на чистоту, то во Флеше вообще нет массивов в том понимании, что присутствует в базовых языках (Delphi, C++).
Проблема здесь не в создании вложенных массивов, а в сохранности данных на каждом иерархическом уровне при их создании. Как говориться Заказчик хочет и "из ружья не выстрелить и двух зайцев убить".

uglan
26.06.2008, 17:02
Разочарован... Не знаю как в C++ но в VB точно можно было делать массивы такого вида какой угодно длины. a[0][0][0][0]...
Значит буду использовать xml.

Всем спасибо!