Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Поиск маскимального (минимального) элемента многомерного массива (http://www.flasher.ru/forum/showthread.php?t=120345)

chugart 18.01.2009 03:23

Поиск маскимального (минимального) элемента многомерного массива
 
Добрый день!

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

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).

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

Я написал в лоб вот так:
Код AS1/AS2:

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

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

У тебя написано:
Код AS1/AS2:

cur = data_arr[i][index];

а должно:
Код AS1/AS2:

cur = data_arr[index][i];

и вместо:
Код AS1/AS2:

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

должно быть:
Код AS1/AS2:

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


chugart 18.01.2009 15:29

Помоему у меня написано все верно.
Ведь
Код AS1/AS2:

cur = data_arr[i][index];// в нашем случае есть cur = data_arr[i]["m2"];

,а написать
Код AS1/AS2:

cur = data_arr[index][i];// было бы не верно т.к. у data_arr нет элемента с индексом "m2", у него есть только индексы 0, 1, 2 и  т.п.

Т.е. исходя все же из процесса формирования массива data_arr (приведу еще раз)
Код AS1/AS2:

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, так как по вашему коду:

Код AS1/AS2:

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

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

Mnilionic 18.01.2009 16:42

Код AS1/AS2:

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
Вот так было:
Код AS1/AS2:

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;

Вот так надо было сделать сразу:
Код AS1/AS2:

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;



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

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