Форум 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=198665)

Wazzabi 02.05.2013 01:09

Скопировать двумерный массив
 
Добрый вечер!

Как скопировать двумерный (массив массивов), чтоб при изменении копии исходник оставался без изменении?
Пробовал concat(); - копируется, но в исходном массиву данные так же изменяется =(

Wolsh 02.05.2013 01:20

Цитата:

но в исходном массиву данные так же изменяется
Видимо, потому что данные — ссылки на объекты? Вы создали копию ссылки, а не объекта. Вы изменяете сам объект. Он один. На него просто две разные ссылки.

Wazzabi 02.05.2013 01:34

Код AS1/AS2:

private var _map:Array;
private var _geoData:Array;
 
///.......
 
_map = _ogmoImporter.getImportedMap(); // это самописный класс для импорта, метод возвращает массив
_geoData = _map.concat(); // попытка скопировать

в массиве данные типа int.
пробовал вот так
Код AS1/AS2:

_map = _ogmoImporter.getImportedMap().concat();
_geoData = _map.concat();

и так
Код AS1/AS2:

_map = _ogmoImporter.getImportedMap().concat();
_geoData = _ogmoImporter.getImportedMap().concat();

написал метод копирования в ручную
Код AS1/AS2:

private function copyToGeoData():void 
                {
                        var lengthX:uint = _map.length;
                        for (var i:int = 0; i < lengthX; i++)
                        {
                                var lengthY:uint = _map[i].length;
                                _geoData.push(new Array(lengthY));
 
                                for (var j:int = 0; j < lengthY; j++)
                                {
                                        _geoData[i][j] = _map[i][j];
                                }
                        }
                }

насколько сильно медленнее будет работать этот метод от concat()?

Wolsh 02.05.2013 01:46

А так не пробовали?
Код AS3:

                        var arr:Array = [2, 12, 85, 06];
                        var bar:Array = arr.concat();
                        bar[0] = 8;
                        trace(arr[0]); // 2

Метод тыка еще никого ничему не научил. Надо ошибки искать, а не перебирать знакомые слова.
Простые типы копируются по значению. Если у Вас не копируются — значит они не простые. Либо проверяете неправильно. Все "чудеса" от невнимательности.

Wazzabi 02.05.2013 02:07

Ваш пример работает. Но если с двумерным массивом - не рабоет
Код AS1/AS2:

var arr:Array = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 012], [013, 14, 15, 16]];
                        var bar:Array = arr.concat();
                        bar[0][0] = 8;
                        trace(arr[0][0]); // 8

может каждый массив в массиве надо копировать по отдельности? =)) Глупость сморозил походу...

Wolsh 02.05.2013 02:08

Естественно, потому что данные в массиве, которому Вы делаете concat() — не int, а Array.
Код AS3:

private function copyToGeoData():void 
                {
                        var lengthX:uint = _map.length;
                        for (var i:int = 0; i < lengthX; i++)
                        {
                                _geoData[i] = _map[i].concat();
                        }
                }


Wazzabi 02.05.2013 02:12

Теперь понял, спасибо большое!


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

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