Подтвердить что ты не робот

AS3: как преобразовать вектор в массив

Какой лучший способ конвертировать вектор в массив в ActionScript3?

Синтаксис обычного каста не работает:

var myVector:Vector.<Foo> = new Vector();
var myArray:Array = Array(myVector); // calls the top-level function Array()

из-за существования функции Массив. Вышеприведенные результаты в массиве, но это массив с одним элементом, состоящим из исходного вектора.

Что оставляет несколько более подробный:

var myArray:Array = new Array();
for each (var elem:Foo in myVector) {
    myArray.push(elem);
}

что прекрасно, я думаю, хотя немного многословный. Это канонический способ сделать это, или есть функция toArray(), скрывающаяся где-то в стандартной библиотеке?

4b9b3361

Ответ 1

ваш подход является самым быстрым... если вы считаете это многословным, тогда создайте функцию утилиты...:)

изменить

Чтобы создать служебную функцию, вам, вероятно, придется отбросить тип следующим образом:

function toArray(iterable:*):Array {
     var ret:Array = [];
     for each (var elem:Foo in iterable) ret.push(elem);
     return ret;
}

Ответ 2

Существует функция, называемая forEach, которую могут использовать как Vector, так и Array. В основном он вызывает функцию для каждого элемента вектора. Вот как это работает:

var myVector:Vector.<Foo> = new Vector();
var myArray:Array = [];

myVector.forEach(arrayConverter);

function arrayConverter(element:*, index:int, array:Array):void{
    myArray[myArray.length] = element;
}

Но я не мог найти функцию, которая просто перемещает все значения из вектора в массив. Другое решение может заключаться в том, что вы создаете класс, который расширяет класс Vector, а затем у вас есть открытая функция, называемая toArray(), и тогда у вас есть этот код в этой функции, поэтому вам не нужно писать его каждый раз, когда вы хотите преобразовать.

Векторная документация

Изменить: Нашел этот старый вопрос сегодня и подумал, что было бы интересно провести тестовый тест всех разных методов в это утреннее утро.

Я использовал вектор с 1000000 единиц и сделал 2 теста для каждого цикла. Один из них использует встроенные функции массива push и один, используя регулярные операции с массивами.

  • Для цикла, а не push: 520 ms
  • Для цикла нажмите: 1027 ms
  • Цикл Foreach, а не push: 1753 ms
  • Цикл Foreach, push: 2264 ms
  • Пока цикл, а не push: 2775 ms
  • Пока цикл, а не нажмите: 3282 ms
  • Цикл Util, а не push: 4059 ms
  • Цикл Util, push: 4570 ms

И вот эталонная оценка с использованием 1000 элементов:

  • Для цикла, а не push: 1 ms
  • Для цикла, нажмите: 2 ms
  • Цикл Foreach, а не push: 2 ms
  • Цикл Foreach, push: 3 ms
  • Пока цикл, а не push: 3 ms
  • Пока цикл, а не push: 4 ms
  • Цикл Util, а не push: 4 ms
  • Цикл Util, push: 5 ms

В принципе, когда вы получаете более 10 000 предметов, вы начинаете видеть реальную разницу. Таким образом, от 0 до 10 000 предметов не имеет значения, что вы используете.

package
{
    public class Loops{
        public static function forLoop(vector:Vector.<Foo>, usePush:Boolean = false):Array{
            var result:Array = [];

            for(var i:int = 0; i < vector.length; i++){
                if(usePush){
                    result.push(vector[i]);
                }else{
                    result[result.length] = vector[i];
                }
            }

            return result;          
        }

        public static function foreachLoop(vector:Vector.<Foo>, usePush:Boolean):Array{
            var result:Array = [];

            for each(var key:String in vector){
                if(usePush){
                    result.push(vector[key]);
                }else{
                    result[result.length] = vector[key];
                }
            }

            return result;          
        }

        public static function whileLoop(vector:Vector.<Foo>, usePush:Boolean):Array{
            var result:Array = [];

            var i:int = 0;
            while(i < vector.length){
                if(usePush){
                    result.push(vector[i]);
                }else{
                    result[result.length] = vector[i];
                }
            }

            return result;                      
        }

        public static function arrayUtilLoop(vector:Vector.<Foo>, usePush:Boolean):Array{
            var result:Array = [];

            function arrayUtilForeach(element:*, index:int, array:Array):void{
                if(usePush){
                    array.push(element);
                }else{
                    array[result.length] = element;
                }
            }           

            vector.forEach(arrayUtilForeach);

            return result;          
        }
    }
}

Я использовал функцию getTimer для выполнения теста, поэтому он может быть не точным на 100%, но разница между разными циклами настолько велика, что я не думаю, что это имеет значение.

Я надеюсь, что кто-то нашел это полезным.

Ответ 3

использование:

var myArray:Array = [];
myArray.push.apply(null, myVector);

или

var myArray:Array = new Array().concat(myVector);

Ответ 4

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

    private var _vector:*;

    public function VectorUtil(vector:*)
    {
        _vector = vector;
    }

    public function toArray():Array
    {
        var a:Array = [];
        for (var i:int = 0; i < _vector.length; ++i)
            a.push(_vector[i]);
        return a;
    }

Ответ 5

Второй ответ Ваукалака не только работает, но и намного быстрее, чем верхний проголосовавший здесь ответ, я немного массировал его, поскольку [] производит фракционно более быстрое построение массива, чем новый Array(). Также ниже приведен лучший способ создания Vector из массива.

// make a Vector from an array
var toVector : Vector.<String> = Vector.<String>(['a','b','c']) 

// populate an array from a Vector
var toArray : Array = [].concat(toVector);

Обратите внимание, что это работает только со вспышкой 11

Ответ 6

вызов функции для каждого элемента в векторе будет медленнее, особенно в более длинном векторе. однако эти примеры, вероятно, все эквивалентны, если вы не имеете дело с довольно длинными Vector/Array - удобочитаемость и простота использования, как правило, важнее оптимизации.

который сказал, я думаю, что самый быстрый способ - использовать цикл while с итератором по сравнению с 0.

var myArray:Array = new Array(myVector.length);
var i:int=myVector.length;
while (i--) {
    myArray[i] = myVector[i];
}

К сожалению, вы не можете использовать эту технику в качестве метода для удобства повторного использования, потому что нет способа указать параметр метода Vector для базового базового типа....: (

Ответ 7

Если у вас есть вектор строк, вы можете сделать:

myArray = myVec.join(",").split(",");

для быстрого и грязного преобразования Array.

Ответ 8

var a: Array = some_vector как массив;