Как мне инициализировать вектор с массивом значений? - PullRequest
6 голосов
/ 13 ноября 2010

Как мне инициализировать вектор с массивом значений?

Я пробовал это, и это хорошо, но не работает!

 langs = new Vector.<String>(["en","fr"]);

Мне также нужно загрузить произвольный массив в вектор, например:

 langlist = ["en","fr"];
 langs = new Vector.<String>(langlist);

Есть ли способ сделать это?


Редактировать: Как инициализировать 2D вектор с помощью двумерного массива значений?

 numbers = [[10,20,30], [10,20,30]];
 nums = Vector.<Vector.<Number>>(numbers);

Я попробовал это, но выдает ошибку:

Ошибка типа: ошибка # 1034: сбой приведения типа

Ответы [ 4 ]

49 голосов
/ 07 июня 2011

Подходящий синтаксис для инициализации вектора строк выглядит так:

var langs:Vector.<String> = new <String>[ "en","fr" ];

Для создания многомерных векторов используйте следующий синтаксис:

var v:Vector.<Vector.<int>> = new <Vector.<int>>[ new <int>[ 1, 2, 3 ], new <int>[ 4, 5, 6 ] ];

Обратите внимание, что следующий синтаксис работает, но менее желателен, поскольку сначала генерирует массив, а затем преобразует его в вектор, который работает медленнее, имеет проблемы с очень большими массивами и не поддерживает многомерные векторы.

var langs:Vector.<String> = Vector.<String>( [ "en","fr" ] );
4 голосов
/ 13 ноября 2010

Вы можете инициализировать Vector.<T> из массива, используя глобальную функцию Vector.<T> :

var vec : Vector.<String> = Vector.<String>(["en","fr"]);
3 голосов
/ 14 ноября 2010

Я не думаю, что вы можете передать массив массивов в Vector:

Vector.<Vector.<Number>>

Приведение типов не работает для сложного типа. Если у вас уже есть 2D Array, рассмотрите следующий код преобразования:

var numbers:Array = [[1, 2, 3], [4, 5, 6]];
var numbersTemp:Array =
numbers.map(
    function (element:*, index:int, arr:Array):Vector.<Number> {
    return Vector.<Number>(element);
});
var nums:Vector.<Vector.<Number>> = Vector.<Vector.<Number>>(numbersTemp);

Конечно, это приведет к тому, что новые копии всего будут созданы дважды, поэтому в идеале вы не должны конвертировать большие списки.

2 голосов
/ 25 июня 2014

Самый простой, быстрый и безопасный для типов способ инициализации вектора из списка значений:

langs = new <String> ["en","fr"];

он не создаст временный массив для инициализации нового вектора, поэтому он сгенерирует самый быстрый байт-код и не будет мешать сборщику мусора бесполезными временными экземплярами массива. Это так же быстро, как и практично, чем:

langs = new Vector.<String>(2);
langs[0] = "en";
langs[1] = "fr";

Самое главное, он будет выполнять проверку типов во время компиляции и уменьшит вероятность получения ошибок во время выполнения

Для 2D векторов прямой синтаксис отсутствует, поэтому вам придется явно создавать каждый вектор:

nums = new <Vector.<Number> > [new <Number>[10,20,30], new <Number>[10,20,30]];

Вы можете получить подробную информацию о производительности непустой инициализации вектора и почему другие решения медленнее здесь:

http://jacksondunstan.com/articles/702

PS: старые компиляторы mxmlc не поймут закрывающие скобки, если они не разделены пробелом:

new <Vector.<Number>>

...