![]() |
Трехмерный массив с подобъектами
Доброго времени суток!
Подскажите, пожалуйста, как мне замутить трехмерный массивчик с вложенными объектами? Пример(просто сам алгоритм): 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. Темно уже на улице, может и туплю чего не обессудьте)) |
Ну и в чем проблема?
|
Здравствуйте uglan!
Мне не совсем понятна целесообразность конструкций: Цитата:
А вообще многомерный массив можно создать с использованием литерала, пример: Код:
var a:Array = [["aga","ugu"],["ege","uau","oh"]];Код:
a[0]Код:
a[0] = "aga"Теперь, если Вы хотите вложить объект (скажем инстанцию Object) в трехмерный массив лучше сделать это так: Код:
a[0][0][0] = {name:"ege", num:10, txt:"bla bla bla"}Код:
a[0][0][0] = new Object(); |
Проблема в том что даже двумерный массив такого вида ничего не возвращает:
Код:
var a=new Array();Код:
a[0][0] = "ugu"Код:
a[0][0][0] = new Object(); |
А подобный вид
Код:
var a:Array =new Array();------------------------------------- Объясню для чего мне это нужно. Мне нужна некая трехуровневая структура иерархического типа в которой будут храниться данные. Причем класс на каждом уровне может быть разный. Пример: 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 Структура создается динамически, поэтому изначально нельзя определить размер массива. |
uglan! Вы поймите следущее. Если Вы создали массив это не значит, что в каждой ячейке его можно создать свойство и присвоить ему значение. Это можно сделать только после создания инстанции Object в ячеке массива.
Сделайте так: в этом примере Цитата:
Код:
var a:Array = [[],[]]; |
А вот так не работает.
Код:
var a:Array = [[],[],[]];И опять таки вот такой код Код:
var a:Array = [[],[]]; |
uglan, а почему вы не хотите использовать xml для хранения того, что вы называете
"трехуровневая структура иерархического типа "? |
Мне кажется массив удобнее(без заморочки с кучей childNodes), если он вообще может работать с тройной структурой.
|
Код:
var a:Array = []; |
Цитата:
|
Цитата:
Код:
var a:Array = []; |
Что некорректно в этом коде?!
Код:
var arr:Array = [];Здесь без потери ранее записанных данных при изменении размерности массива не обойтись. Потому и не работает. Нужно определить размерность массива заранее. А вот размер каждого измерения Вы можете создавать динамически. Цитата:
В первой строке Вы создаете одномерный массив a. Во второй строке, Вы создаете второе измерение массива a В третьей строке Вы присваиваете ячеке двумерного массива значение "АGA". Пока все вроде бы корректно. В четвертой строке, Вы пытаетесь создать уже четвертое измерение минуя 3. Разумеется это невозможно. Поэтому, Вы вынуждены будете ячейку a[0][0] =="AGA" переопределить массивом создающим 3-е измерение. Разумеется "AGA" сохранено не будет. Код:
var a:Array = []; |
А вот так не работает:
var a:Array = []; a[0][0][0] = []; a[0][0][0] = ':Q'; trace(a[0][0][0]); А вот так var arr:Array = []; Код:
arr[0] = []Чтобы создать цикл мне нужно будет знать длину каждого уровня массива. for(i=0;i<arr.length;++i){ for(u=0;u<arr[i].length;++u){ } } ... |
uglan, не надо постить несколько сообщений подряд. Пользуйтесь кнопкой "Изменить"
|
Давайте разберем этот код подробнее для понимания проблемы.
В первой строке Вы создаете одномерный массив a. Во второй строке, Вы создаете второе измерение массива a В третьей строке Вы присваиваете ячеке двумерного массива значение "АGA". Пока все вроде бы корректно. В четвертой строке, Вы пытаетесь создать уже четвертое измерение минуя 3. Разумеется это невозможно. Поэтому, Вы вынуждены будете ячейку a[0][0] =="AGA" переопределить массивом создающим 3-е измерение. Разумеется "AGA" сохранено не будет. Код:
var a:Array = [];Хорошо в таком случае как мне задействовать каждый уровень? то есть чтобы значения хранились тут 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 и т.д. |
uglan!
Давайте разберем и этот код. Цитата:
В первой строке Вы создаете второе измерение не создав первое (ошибка). В последующих четырех строках Вы записываете значения в 4 ячейки несуществующего одномерного массива. А вот в третьей и четвертой пытаетесь присвоить значение не существующей ячейке несуществующего двумерного массива (массив arr на этот момент одномерный). Поэтому length выдает что попало (в данном случае 1). Как на самом деле должен выглядеть этот код?! Вот так: Код:
arr = []Цитата:
Код:
a = [] |
Во флеше нет трехмерных массивов.
Но можно использовать Массив массивов. Конструкция вида Код:
var zeroObject:Object = new Object(); |
Цитата:
Проблема здесь не в создании вложенных массивов, а в сохранности данных на каждом иерархическом уровне при их создании. Как говориться Заказчик хочет и "из ружья не выстрелить и двух зайцев убить". |
Разочарован... Не знаю как в C++ но в VB точно можно было делать массивы такого вида какой угодно длины. a[0][0][0][0]...
Значит буду использовать xml. Всем спасибо! |
| Часовой пояс GMT +4, время: 17:04. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.