PDA

Просмотр полной версии : Поиск маскимального (минимального) элемента многомерного массива


chugart
18.01.2009, 03:23
Добрый день!

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

var mainArr:Array = new Array();

for ( i = 0; i < N; i++ ) {
var subVar:Array = new Array();
subArr['m1'] = K1; // ну что то присваиваем элементу массива
subArr['m2'] = K2; // тоже что то присваиваем элементу массива
subArr['m3'] = K3; // тоже что то присваиваем элементу массива
subArr['ml4'] = K4; // тоже что то присваиваем элементу массива

mainArr[i] = subVar; // т.е. у каждого mainArr[i] есть mainArr[i]['m1'], mainArr[i]['m2'], mainArr[i]['m3'], mainArr[i]['m4']
}


Нужно найти в этом многомерном масиве максимальный элемент m2, т.е максимальный элемент из всех mainArr[i]['m2'] (i от 0 до N).

Как это можно сделать красивым способом?

Я написал в лоб вот так:

var yInd:Array = getMaxMinIndexInArr( mainArr, "m2" ); trace( "yInd " + yInd ); // вывод для дебага

// возвращает минимальное и максимальное значение индексов из массива данных
// в нашем случае index='m2'
function getMaxMinIndexInArr( data_arr:Array, index:String ):Array {
var arr:Array = new Array(2);
var cur:Number = data_arr[0][index];
arr[0] = cur;
arr[1] = cur;
for( var i:Number = 1; i < (data_arr.length - 1) ; i++) {
cur = data_arr[i][index];
trace( "cur =" + cur + " arr[0]=" + arr[0] );// организуе вывод для дебага
if ( cur < arr[0] ) {
arr[0] = cur;
trace(" cur < arr[0] присвоили arr[0]=" + arr[0] );// еще один вывод для дебага
}
}

return arr;
}


Вроде бы все правильн ои тупо - если текущий элемент массива меньше чем переменная в которой мы храним имнимальное число. то в переменную которая хранит минимальное число записываем текущий элемент массива. НО вывод output выдает мне следующий екст
cur =658.63 arr[0]=644.47
cur =549.43 arr[0]=644.47
cur < arr[0] присвоили arr[0]=549.43
cur =1285.47 arr[0]=549.43
cur < arr[0] присвоили arr[0]=1285.47
yInd 1285.47,644.47
И получается что в какой то момент времени число 1285.47 меньше чем 549.43. В чем фокус?
ПОдскажи плз.

Sajaxt
18.01.2009, 04:38
На первый взгляд, кажется что ошибка вот сдесь:

У тебя написано:
cur = data_arr[i][index];

а должно:
cur = data_arr[index][i];


и вместо:
for( var i:Number = 1; i < (data_arr.length - 1) ; i++) {...

должно быть:
for( var i:Number = 1; i < (data_arr[index].length - 1) ; i++) {....

chugart
18.01.2009, 15:29
Помоему у меня написано все верно.
Ведь cur = data_arr[i][index];// в нашем случае есть cur = data_arr[i]["m2"];
,а написать cur = data_arr[index][i];// было бы не верно т.к. у data_arr нет элемента с индексом "m2", у него есть только индексы 0, 1, 2 и т.п.
Т.е. исходя все же из процесса формирования массива data_arr (приведу еще раз)var mainArr:Array = new Array();
for ( i = 0; i < N; i++ ) {
var subVar:Array = new Array();
subArr['m1'] = K1; // ну что то присваиваем элементу массива
subArr['m2'] = K2; // тоже что то присваиваем элементу массива
subArr['m3'] = K3; // тоже что то присваиваем элементу массива
subArr['m4'] = K4; // тоже что то присваиваем элементу массива

mainArr[i] = subVar; // т.е. у каждого mainArr[i] есть mainArr[i]['m1'], mainArr[i]['m2'], mainArr[i]['m3'], mainArr[i]['m4']
}
data_arr является массивом массивов т.е. каждый i-й элемент data_arr содержит в себе массив с индексами "m1", "m2", "m3", "m4". Т.е. именно ест ьэлементы data_arr[i][index].

Или я что то не понимаю?

Sajaxt
18.01.2009, 16:32
Да верно, но я вам указал на второй цикл с i, так как по вашему коду:

for( var i:Number = 1; i < (data_arr.length - 1) ; i++) {...

вы сравниваете не элементы внутренего массива с индексом index, а сравниваете элементы всех массивов с индексом indeх....
поэтому надо провести исправления которые я вам привёл выше...

Mnilionic
18.01.2009, 16:42
var sample:Array = [[10,20.8,5,40], [5,15,30,25], [7,14.5,21,28]];
var N = 3;

var mainArr:Array = new Array();
for ( var i = 0; i < N; i++ ) {
var subArr:Array = new Array();
subArr['m1'] = sample[i][0];
subArr['m2'] = sample[i][1];
subArr['m3'] = sample[i][2];
subArr['ml4'] = sample[i][3];
mainArr.push(subArr);
}


// поиск максимального и минимального m2
var indexes = mainArr.sortOn('m2', 8|16);
var max_m2 = mainArr[indexes.pop()]['m2'];
var min_m2 = mainArr[indexes.shift()]['m2'];

trace('max m2 = ' + max_m2);
trace('min m2 = ' + min_m2);

chugart
18.01.2009, 17:08
нет нет.. мне нужно именно найти максимальный и минимальный элемент с индексом ['m2'] среди все массивов data_arr[i], т.е. мне нужно искать не внутри какого data_arr[i] максимальный элемент, а найти среди всех массивов в data_arr мин макс элемент с индексом ["m2"]

Mnilionic
18.01.2009, 18:08
ну я Вам и написал решение. Вы бы сначала посмотрели, а потом нет-неткали.

chugart
18.01.2009, 18:28
Mnilionic, а я вам :).
Это был пост для Sajaxt.

Mnilionic, ваше решение работает спасибо, то что надо!
Sajaxt, вам тоже спасибо что потратили на меня время

Ведь этой темы можно было избежать если бы решение в лоб у меня заработало
А почему у меня не работало решение в лоб?
Потому что я слишком доверчивый :).
Мой массив data_arr строиться из xml документа, параметры в котором являются значениями атрибутов узлов. Я понаделся что значения атрибутов сразу будут раззматриваться как Number, но как выяснилось лучше делать явное преобразование с помощью parseInt
Вот так было:
var subArr:Array = new Array();
subArr['date'] = curDate;
subArr['r'] = curNode.attributes.r;
subArr['m'] = curNode.attributes.m;
subArr['mo'] = getRusMonthNameFromDate( curDate );
subArr['ml'] = mlsc / minimizer;
mainArr[i] = subArr;
Вот так надо было сделать сразу:
var subArr:Array = new Array();
subArr['date'] = curDate;
subArr['r'] = parseInt(curNode.attributes.r);// явное преобразование в число
subArr['m'] = parseInt(curNode.attributes.m););// явное преобразование в число
subArr['mo'] = getRusMonthNameFromDate( curDate );
subArr['ml'] = mlsc / minimizer;
mainArr[i] = subArr;