PDA

Просмотр полной версии : Ошибка при многократном вызове функции сортировки массива


abugaev
15.04.2010, 13:22
День добрый.

Краткое описаниее проблемы:
Есть массив currentItems, в котором есть какие-то случайные числовые значения. Его надо присвоить трем переменным и перемешать каждую из них в случайном порядке.
Реализовано так: для каждой из переменных получаю массив со случайными индексами от 1 до 1000 (getIndexes()), после чего эти же переменные отдаю на сортировку (sortArray()).

А после того, как вывожу получившийся результат (после трех вызовов sortArray()), все переменные принимают значение последнего вызова функции sortArray(). Причем, если выводить внутри самой sortArray(), то все нормально.

var currentItems:Array = new Array();// Select items, that will use in the game.

var items1:Array = new Array();
var items2:Array = new Array();
var items3:Array = new Array();

var count = 22;


function formArray(num:Number) {
for (i = 0; i < num; i++) {
//trace(currentItems[i]);
currentItems[i] = random(count);
}

}

function getIndexes(num:Number) {
var indexes:Array = new Array();
for (i = 0; i < num; i++) {
indexes[i] = random(1000);
//trace(i);
}
return indexes;
}

function sortArray(inp:Array){

var tmp:Number = new Number();
var sortArr = currentItems;
for (i = 0; i < inp.length; i++) {
//trace("");
for (k = i; k < inp.length; k++) {
if (inp[k] < inp[i]) {
tmp = inp[i];
inp[i] = inp[k];
inp[k] = tmp;


tmp = sortArr[i];
sortArr[i] = sortArr[k];
sortArr[k] = tmp;
}
}
}
trace("sortArr: " + sortArr);
return sortArr;
}

formArray(9);
trace("Array: "+ currentItems);
trace("");
trace("Get random indexes");
items1 = getIndexes(currentItems.length);
items2 = getIndexes(currentItems.length);
items3 = getIndexes(currentItems.length);
trace(items1);
trace(items2);
trace(items3);
trace("Sorted indexes");
items1 = sortArray(items1);
items2 = sortArray(items2);
items3 = sortArray(items3);
trace(items1);
trace(items2);
trace(items3);

Пример вывода:

Array: 18,13,3,12,12,5,20,21,16

Get random indexes
17,924,517,925,887,321,758,237,492
440,773,456,730,540,370,82,483,968
831,138,374,541,31,507,194,529,48
Sorted indexes
sortArr: 18,21,5,16,3,20,12,13,12
sortArr: 12,20,18,5,13,3,16,21,12
sortArr: 13,12,20,16,18,3,21,5,12
13,12,20,16,18,3,21,5,12
13,12,20,16,18,3,21,5,12
13,12,20,16,18,3,21,5,12

Три строчки «SortArr: xxxxxxxxx» — это вывод из самой функции перед тем, как она вернет свое значение.

Причем если выводить значения переменных после каждого вызова функции, то выводятся адекватные значения. Но после того как функция вызвана 3 раза, все переменный берут значения последнего вызова.

items1 = sortArray(items1);
trace(items1);
items2 = sortArray(items2);
trace(items2);
items3 = sortArray(items3);
trace(items3);
trace("");
trace(items1);
trace(items2);
trace(items3);


Пример вывода:
Array: 14,15,14,15,16,18,19,2,4

Get random indexes
802,963,768,426,203,828,752,458,658
184,43,693,465,677,591,421,321,99
632,947,952,722,619,849,559,72,87
Sorted indexes
sortArr: 16,15,2,4,19,14,14,18,15
16,15,2,4,19,14,14,18,15
sortArr: 15,15,16,18,14,4,14,19,2
15,15,16,18,14,4,14,19,2
sortArr: 19,2,14,14,15,18,4,15,16
19,2,14,14,15,18,4,15,16

19,2,14,14,15,18,4,15,16
19,2,14,14,15,18,4,15,16
19,2,14,14,15,18,4,15,16

Чтобы не было ощущения абстрактного примера: currentItems — это выборка случайных элементов из массива с данными длинной count.

Есть способ заствить переменные принимать реально возвразаемые значения функции, а не ее последнего вызова?

Спасибо всем, кто откликнется.

udaaff
15.04.2010, 13:32
var sortArr:Array = [].concat(currentItems);
Сложные типы передаются по ссылке, а не по значению.

abugaev
15.04.2010, 13:40
Большое спасибо, не знал.

Проблема решена.