Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как переместить произвольный элемент массива в конец? (http://www.flasher.ru/forum/showthread.php?t=189653)

Dip52 15.12.2012 15:54

Как переместить произвольный элемент массива в конец?
 
Здравствуйте. Помогите, пожалуйста. Я написал такой, который позволяет перемещать произвольный элемент массива в конец. Но меня интересует, есть ли возможность упростить мой код или, может быть, существует команда, которая позволяет сделать тоже самое, но с помощью одной строки. Большое спасибо.

Код AS3:

//Цель: изменение индекса элемента массива — с одного места (допустим: 1) в другое (в конец) (Другими словами: перемещение произвольного элемента массива в конец).
//Определяю массив:
var array:Array = [1,2,3,4,5];
 
//Вывожу значение массива:
trace(array);//trace: 1,2,3,4,5
 
 
//Определяю объект:
var object:Object = [];
//Изменяю значение объекта на произвольный элемент массива:
object = array[0];
//Удаляю произвольный элемент массива (тот, который стал в качестве значения object:
array.splice(0,1);
//Добавляю значение object в массив:
array.push(object);
//Очищаю значение object:
object = null;
 
//Вывожу значение массива:
trace(array);//trace: 2,3,4,5,1


am_devcorp 15.12.2012 16:06

Ну еще проще — в одну строчку
Код AS3:

var array:Array = [1,2,3,4,5];
array.push(array.splice(0,1)[0]);

Можно и без [0] в конце, но я не знаю почему

iNils 15.12.2012 16:38

Цитата:

Сообщение от am_devcorp (Сообщение 1109998)
Ну еще проще — в одну строчку
Код AS3:

var array:Array = [1,2,3,4,5];
array.push(array.splice(0,1)[0]);

Можно и без [0] в конце, но я не знаю почему

splice () возращает массив, поэтому без [0] в конце, последним элементом в массиве станет одноэлементный массив.
То есть, массив [1,2,3,4,5], если из него убрать 3 и поместить в конец, станет [1,2,4,5,[3]]. но трейс выдаст 1,2,4,5,3, что ошибочно даст впечатление, что [0] не нужен.

udaaff 15.12.2012 16:50

Цитата:

//Определяю объект:
var object:Object = [];
Для чего вы тут массив присваиваете?

Цитата:

Можно и без [0] в конце
Если использовать apply().
Код AS3:

array.push.apply(null, array.splice(0,1));


am_devcorp 15.12.2012 16:52

Цитата:

Сообщение от iNils (Сообщение 1110002)
но трейс выдаст 1,2,4,5,3, что ошибочно даст впечатление, что [0] не нужен.

Я попался. Жаль конечно, что трейс не может адекватно выводить значения.
Dip52: [0] нужен и очень даже нужен!

wvxvw 15.12.2012 17:59

Только вот фишка в том, что splice не смотря на то, что должна модифицировать массив, в этом случае, выделит память под массив по-новой, иногда это не принципилаьно, но иногда лучше так не делать (если массив большой). Аналогично динамическое наращивание массива скорее всего приведет к выделению памяти и копированию массива. Так что, если массив очень большой, а время не особо критично, то ИМО, лучше просто сместить все оставшиеся элементы на единичку влево, а последний заменить тем, который нужно переставить.

Код AS3:

package
{
    import flash.display.Sprite;
 
    public class RotateShiftExample extends Sprite
    {
        public function RotateShiftExample()
        {
            super();
            // 1,2,4,5,3
            trace(rotateShift([1, 2, 3, 4, 5], 2));
        }
 
        private static function rotateShift(
            array:Array, index:int):Array
        {
            var limit:int = array.length - 1;
            var element:Object = array[index];
            while (index < limit)
                array[index] = array[++index];
            array[index] = element;
            return array;
        }
    }
}


iNils 15.12.2012 17:59

Цитата:

Сообщение от am_devcorp (Сообщение 1110007)
Я попался. Жаль конечно, что трейс не может адекватно выводить значения.

А трейс тут не причем, это у Array такие данные метод toString () выдает.

Dip52 17.12.2012 02:54

Цитата:

Сообщение от udaaff (Сообщение 1110006)
Для чего вы тут массив присваиваете?

А чем отличается var object:Object = new Object(); от var object:Object; ? В первом случае он до конца определен? Если да, то я представлял, что [] и есть конечное определение объекта. Если я неправильно понимаю, помогите, пожалуйста, понять правильно. Спасибо. :)

iNils 17.12.2012 03:06

new Object() или {} - это создание объекта.
new Array() или [] - создание массива.

caseyryan 17.12.2012 10:09

Цитата:

А чем отличается var object:Object = new Object(); от var object:Object; ? В первом случае он до конца определен?
Не совсем. В первом случае он определен, а во втором нет. Это всего лишь объявление переменной и не более.

udaaff 17.12.2012 10:16

Цитата:

А чем отличается var object:Object = new Object(); от var object:Object; ?
Код AS3:

//Определяю объект:
var object:Object = {};
//Изменяю значение объекта на произвольный элемент массива:
object = array[0];

Здесь, в первой строке, вы создаёте новый объект и записываете ссылку на него в переменную object, а следующей строкой присваиваете object новое значение. Поэтому смысла создаватиь объект в первой строке нету. Надо было:
Код AS3:

var object:Object = array[0];



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

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