Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.01.2009, 03:23
chugart вне форума Посмотреть профиль Отправить личное сообщение для chugart Найти все сообщения от chugart
  № 1  
Ответить с цитированием
chugart

Регистрация: Jan 2009
Сообщений: 18
По умолчанию Поиск маскимального (минимального) элемента многомерного массива

Добрый день!

У меня есть многомерный массив следующей структуры:
Код 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. В чем фокус?
ПОдскажи плз.

Старый 18.01.2009, 04:38
Sajaxt вне форума Посмотреть профиль Отправить личное сообщение для Sajaxt Найти все сообщения от Sajaxt
  № 2  
Ответить с цитированием
Sajaxt
 
Аватар для Sajaxt

Регистрация: Dec 2008
Адрес: Германия
Сообщений: 78
Отправить сообщение для Sajaxt с помощью ICQ Отправить сообщение для Sajaxt с помощью Skype™
На первый взгляд, кажется что ошибка вот сдесь:

У тебя написано:
Код 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++) {....
__________________
Ошибок не делает лишь тот, кто ничего не делает!

Старый 18.01.2009, 15:29
chugart вне форума Посмотреть профиль Отправить личное сообщение для chugart Найти все сообщения от chugart
  № 3  
Ответить с цитированием
chugart

Регистрация: Jan 2009
Сообщений: 18
Помоему у меня написано все верно.
Ведь
Код 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].

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

Старый 18.01.2009, 16:32
Sajaxt вне форума Посмотреть профиль Отправить личное сообщение для Sajaxt Найти все сообщения от Sajaxt
  № 4  
Ответить с цитированием
Sajaxt
 
Аватар для Sajaxt

Регистрация: Dec 2008
Адрес: Германия
Сообщений: 78
Отправить сообщение для Sajaxt с помощью ICQ Отправить сообщение для Sajaxt с помощью Skype™
Да верно, но я вам указал на второй цикл с i, так как по вашему коду:

Код AS1/AS2:
for( var i:Number = 1; i < (data_arr.length - 1) ; i++) {...
вы сравниваете не элементы внутренего массива с индексом index, а сравниваете элементы всех массивов с индексом indeх....
поэтому надо провести исправления которые я вам привёл выше...
__________________
Ошибок не делает лишь тот, кто ничего не делает!

Старый 18.01.2009, 16:42
Mnilionic вне форума Посмотреть профиль Отправить личное сообщение для Mnilionic Найти все сообщения от Mnilionic
  № 5  
Ответить с цитированием
Mnilionic
 
Аватар для Mnilionic

Регистрация: Aug 2005
Адрес: я из Ленинграда
Сообщений: 1,082
Отправить сообщение для Mnilionic с помощью ICQ
Код 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);


Последний раз редактировалось Mnilionic; 18.01.2009 в 16:47. Причина: добавил поиск минимального значения
Старый 18.01.2009, 17:08
chugart вне форума Посмотреть профиль Отправить личное сообщение для chugart Найти все сообщения от chugart
  № 6  
Ответить с цитированием
chugart

Регистрация: Jan 2009
Сообщений: 18
нет нет.. мне нужно именно найти максимальный и минимальный элемент с индексом ['m2'] среди все массивов data_arr[i], т.е. мне нужно искать не внутри какого data_arr[i] максимальный элемент, а найти среди всех массивов в data_arr мин макс элемент с индексом ["m2"]

Старый 18.01.2009, 18:08
Mnilionic вне форума Посмотреть профиль Отправить личное сообщение для Mnilionic Найти все сообщения от Mnilionic
  № 7  
Ответить с цитированием
Mnilionic
 
Аватар для Mnilionic

Регистрация: Aug 2005
Адрес: я из Ленинграда
Сообщений: 1,082
Отправить сообщение для Mnilionic с помощью ICQ
ну я Вам и написал решение. Вы бы сначала посмотрели, а потом нет-неткали.

Старый 18.01.2009, 18:28
chugart вне форума Посмотреть профиль Отправить личное сообщение для chugart Найти все сообщения от chugart
  № 8  
Ответить с цитированием
chugart

Регистрация: Jan 2009
Сообщений: 18
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, время: 16:48.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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