Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Vector как ассоциативный массив (http://www.flasher.ru/forum/showthread.php?t=169818)

Vishapakahr 12.10.2011 20:42

Vector как ассоциативный массив
 
Здравствуйте , питаюсь осуществить следующее

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.text.TextField;
 
 
        public class vector_test extends Sprite
        {
 
                private var v:Vector.<String> = new <String>[];
                //private var v:Array = [];
                private var txt:TextField = new TextField();
                public function vector_test()
                {
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP;
 
                        txt.autoSize = 'left';
                        addChild(txt);
 
                        for(var i:int = 0;i<4;i++){
 
                                try{
                        v['b'+i] = 'bbb';
                                }catch(e:Error){
                                txt.appendText(e.message+'\n');
                                }
                        txt.appendText(v['b'+i]+'\n');
 
                        }
                        txt.y = 150;
                }
        }
}

Печатает Error #1056 , однако при

Код AS3:

private var v:Array = [];

Все нормально работает. В чем проблем с векторам ? как можно его осуществлять ?

-De- 12.10.2011 20:51

Скажите, а что вот эта строчка делает по вашему?
Код AS3:

v['b'+i] = 'bbb';

Что такое вектор (массив)? Что такое ассоциативный массив? Чем массив отличается от ассоциативного массива?

Vishapakahr 12.10.2011 20:56

Цитата:

Сообщение от -De- (Сообщение 1038718)
Скажите, а что вот эта строчка делает по вашему?
Код AS3:

v['b'+i] = 'bbb';

Что такое вектор (массив)? Что такое ассоциативный массив? Чем массив отличается от ассоциативного массива?

ассоциативный массив это кагда кагда можно вызовать элемент массива с помощью строки , а не ассоциативный кагда только с помощью индексов. Вектор , это тот же массив , толька тут можно задать тип элементов массива. Может неправильно с формулировал задачу ... Мне нужно делать ассоциативный массив где все элементы одного и того же типа. В компиляторе это удобно ибо показывает свойство типа при использовании. Как можно его делать ?

BezDelnik 12.10.2011 21:03

насколько я все это понимаю:

Array - индексированный массив. Индексы - int. Элементы - что угодно
Vector - индексированный массив. Индексы - int. Элементы - данные одного типа
Object - ассоциативный массив. Индексы - String. Элементы - что угодно
Diictionary - ассоциативный массив. Индексы - что угодно. Элементы - что угодно

GBee 12.10.2011 21:13

Надстройку над объектом.

Vishapakahr 12.10.2011 21:14

Цитата:

Сообщение от BezDelnik (Сообщение 1038727)
насколько я все это понимаю:

Array - индексированный массив. Индексы - int. Элементы - что угодно
Vector - индексированный массив. Индексы - int. Элементы - данные одного типа
Object - ассоциативный массив. Индексы - String. Элементы - что угодно
Diictionary - ассоциативный массив. Индексы - что угодно. Элементы - что угодно

Спасибо за Dictionary , незнал раньше :) нащет первого

Код AS3:

var a:Array = [];
                        a['something'] = 'element of something';
                        txt.appendText(a['something']+'\n');
 
                        txt.y = 150;

Это у меня печатает 'element of something' , а как получился что индекс взял как строка ?

Добавлено через 45 секунд
Цитата:

Сообщение от GBee (Сообщение 1038730)
Надстройку над объектом.

А как это делать ?

GBee 12.10.2011 21:26

Цитата:

А как это делать ?
Код AS3:

package
{
        public class Strings
        {
                private var _dict:Object = {};
                public function getString(key:String):String
                {
                        return _dict[key] as String
                }
 
                public function addString(key:String, value:String):void
                {
                        _dict[key] = value;
                }
        }
}


Vishapakahr 12.10.2011 21:28

А точно ! спасибо :)

-De- 12.10.2011 21:40

Цитата:

Сообщение от Vishapakahr (Сообщение 1038721)
ассоциативный массив это кагда кагда можно вызовать элемент массива с помощью строки , а не ассоциативный кагда только с помощью индексов.

Нет. Даже если попытаться как-то понять "вызовать элемент массива с помощью строки".
Лучше бы почитали про работу с массивами и что они такое. Может вызывать элементы перестали бы. И поняли чётко, что такое индекс.

Ассоциативный массив, где все элементы одного и того же типа (и это условие проверяется компилятором) на as3 сделать нельзя. Но GBee хороший вариант предложил.

Котяра 13.10.2011 00:33

Дело в том, что Array не "честный" массив, а Vector честный.
Array может выступать и в качесте хэшмапы, где ключом может быть и строка а не только uint.
Вместо
Код AS3:

v['b'+i] = 'bbb';

делайте
Код AS3:

v[i] = 'bbb';

или
Код AS3:

v.push('bbb');

И вы не совсем понимаете разницу между Dictionary и Object.
Использовать в качестве ключа в словаре строку - нонсенс.
Словарь нужен для использования в качестве ключа ссылочных объетов.
Для строк и неупорядоченных чисел - Object
Для упорядоченных наборов индексов - Array.
Я вообще предпочитаю установку значеий массива только через push - это позволяет избежать глупых ошибок с пропущенными индексами и превращения массива в объект (хэш)

Vishapakahr 13.10.2011 00:47

Ну да про push и с индексами знал , мне нужен был ассоциативный.

stweet 13.10.2011 02:53

Котяра хорошо написал:
Цитата:

Я вообще предпочитаю установку значеий массива только через push - это позволяет избежать глупых ошибок с пропущенными индексами и превращения массива в объект (хэш)
так же стараюсь избегать явных индексов, есть же пуш и уншифт, спланс - этого вполне достаточно чтобы работать с массивом. А если нужны иного рода контейнера то тут "объект" в точку, и если хорошо подумать и чутка посидеть то можно свой навороченный классик написать который и по строке и по индексу и типизированный и нет, добавить сортировки и т.п. фичи и будит у вас свой навороченный
"мвссив + вектор + объект".

in4core 13.10.2011 02:58

Цитата:

И вы не совсем понимаете разницу между Dictionary и Object.
Использовать в качестве ключа в словаре строку - нонсенс.
чейто? просто даже интересно с какого перепуга такие заявления

Код AS3:

var d:Dictionary = new Dictionary(true);
d['hashOfMap'] = 5.1;

Это повашему нонсенс ? или я что то не так понял

Bgg 13.10.2011 03:17

Цитата:

Сообщение от in4core (Сообщение 1038804)
чейто? просто даже интересно с какого перепуга такие заявления

Код AS3:

var d:Dictionary = new Dictionary(true);
d['hashOfMap'] = 5.1;

Это повашему нонсенс ? или я что то не так понял

Вы не так поняли значение слова "нонсенс".

in4core 13.10.2011 04:03

Нет я все верно понял. я не говорю что Котяра говорит, что при таком подходе будет РТЕ, я говорю как раз о том, что в этом случае я не вижу влоб плохого тона, и утверждение
Цитата:

Словарь нужен для использования в качестве ключа ссылочных объетов.
считаю чисто надуманным. Не вижу ни одного доказателства, как например писать анонимные функции - что явно является дурным тоном. Это тема из оперы а пишешь ли ты this, а пишешь ли ты super() , - тоесть как говорится на любителя, в данном случае у каждого своя конвенция.
Я почему так резко высказался, потому - что ТС оказывается даже не знал что есть Dictionary и такие заявления как написал Котяра изначально могут ввести в заблуждение.

ChuwY 13.10.2011 05:32

А какой смысл использовать словарь вместо объекта-хэшмапы, если ты его используешь как объект?
Только сбивает с толку того, кто будет это читать.

carrotoff 13.10.2011 10:35

Цитата:

считаю чисто надуманным. Не вижу ни одного доказателства,
А что нужно доказать? Использование словарей не по прямому назначению?
Трусы же тоже можно через голову одевать, и даже можно доказать, что это не есть неправильно

in4core 13.10.2011 13:00

Цитата:

А что нужно доказать? Использование словарей не по прямому назначению?
Да где вы это прочитали? откуда такие мысли ? С таким успехом вектор нафих не нужен - массива достаточно, если не считать что в скорости выигрывает, да и то в такой которую невидно невооруженным главзом. Хотя про вектор это я конечно загнул, но идеология та же

GBee 13.10.2011 13:24

Цитата:

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

Котяра 13.10.2011 15:31

Цитата:

Вектор, к тому же плотный массив,
да
Код AS3:

var v:Vector.<int> = new Vector.<int>();
v[100]= 100; //RangeError: Error #1125: Индекс 100 выходит за границы диапазона 0.

А иcпользовать в качестве ключа для словаря строку, пусть не нонсенс, но моветон. :)

Vishapakahr 13.10.2011 15:59

Всего пару вопросов про вектор и массив. Скажем у меня массив спрайтов

Код AS3:

private var v:Vector.<Sprite> = new <Sprite>[];
//private var v:Array = [];
for(var i:int = 0;i<10;i++){
                        v[i] = new Sprite();
                        v[i].graphics.beginFill(0xff0000);
                        v[i].graphics.drawRect(0,0,100,100);
                        v[i].graphics.endFill();
                        v[i].x = 110*i;
 
                        addChild(v[i]);
}

В обеих случаях у меня будет тот же результат да ? Хочется узнать предпочтительнее ли использовать здесь вектор а не просто массив и почему ? кроме того что компилятор познает тип и откривает свойство при использовании ))

И следующий вопрос , какого разница между new Vector.<int>(); и new <int>[]; обьявлениями ? или они идентичны ?

GBee 13.10.2011 16:10

Лучше создать спрайт, сделать с ним все что надо и в конце пихнуть в массив.


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

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