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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.06.2007, 20:36
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 1  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
По умолчанию число из массива в массив = объект?

Что-то какой-то вывих мозга под конец рабочего дня

Код:
arrY0=[]
for (var i=0; i<4; i++) {
	arrY0[i]=i
	trace(typeof(arrY0[i])+" "+arrY0[i]+" arrY0")
}
	
arrYk=[] 

for (var i=0; i<4; i++) {
	id=Math.round(Math.random()*(arrY0.length-1))
	trace("id "+id+" "+typeof(arrY0[id])+" "+arrY0[id])
	arrYk.push(arrY0.splice(id, 1)) 
	trace(typeof(arrYk[i])+" "+arrYk[i]+" push "+arrYk.length)
}
Выводит в Output:

number 0 arrY0
number 1 arrY0
number 2 arrY0
number 3 arrY0
id 0 number 0
object 0 push 1
id 0 number 1
object 1 push 2
id 1 number 3
object 3 push 3
id 0 number 2
object 2 push 4

Как так?
Берет из массива число, записывает (push) в другой массив, читает его как число, но это НЕ ЧИСЛО, а объект?

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

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
Все правильно. В массиве может быть что угодно. Надо кастить, если надо.

Старый 27.06.2007, 20:46
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 3  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Все разобрался таки
Как обычно все просто
Код:
arrY0=[]
for (var i=0; i<4; i++) {
	arrY0[i]=i
	trace(typeof(arrY0[i])+" "+arrY0[i]+" arrY0")
}
	
arrYk=[] 

for (var i=0; i<4; i++) {
	id=Math.round(Math.random()*(arrY0.length-1))
	trace("id "+id+" "+typeof(arrY0[id])+" "+arrY0[id])
	arrYk.push(arrY0.splice(id, 1)[0]) 
	trace(typeof(arrYk[i])+" "+arrYk[i]+" push "+arrYk.length)
}
Разница вот в чем:
было arrYk.push(arrY0.splice(id, 1))
стало arrYk.push(arrY0.splice(id, 1)[0])

т.е. splice возращает массив все-таки, хотя бы состоящий и из одного элемента, а это уже объект.

Теперь все нормуль:
number 0 arrY0
number 1 arrY0
number 2 arrY0
number 3 arrY0
id 1 number 1
number 1 push 1
id 2 number 3
number 3 push 2
id 0 number 0
number 0 push 3
id 0 number 2
number 2 push 4

Старый 27.06.2007, 20:47
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
Цитата:
Сообщение от Kikasso
Все правильно. В массиве может быть что угодно. Надо кастить, если надо.
проблема в другом
если arrY0 имеет вид [1,2,3,4], то arrYk [[1],[2],[3],[4]]
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
А, точно. Просто в классах компиллятор ругается, если не кастить. Ну он-то не знает, что в массиве, а плеер уже знает.
А почему просто не написать
Код:
 arrYk.push(arrY0[id]);
слайсы тут какие-то..


Последний раз редактировалось Kikasso; 27.06.2007 в 21:00.
Старый 27.06.2007, 21:01
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 6  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Цитата:
Сообщение от Kikasso
А, точно. Просто в классах компиллятор ругается, если не кастить. Ну он-то не знает, что в массиве, а плеер уже знает.
А почему просто не написать
Код:
 arrYk.push(arrY0[id]);
слайсы тут какие-то..
Это перемешивалка массива потомучто.
см. параметр id, родительский массив постепенно удаляется.

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

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
А, точно, там splice.
Код:
var arr:Array = [1,2,3,4,5,6,7,8,9];
function f():Number{return random(2);}
arr.sort(f);
trace(arr);
Чей код, не знаю. Не совсем точно.


Последний раз редактировалось Kikasso; 27.06.2007 в 21:08.
Старый 27.06.2007, 21:23
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 8  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Изящное решение!

Но основано скорее на глюке, кстати вот интересно проследить параметр n запуская несколько раз код
Код:
arr = [1,2,3,4,5,6,7,8,9];
n=0
function f(){
	n++
	return  random(2);
	}
arr.sort(f);
trace(arr+" "+n);
а я по-простому делал... в лоб...
век живи - век учись!

Старый 27.06.2007, 21:27
Kikasso вне форума Посмотреть профиль Отправить личное сообщение для Kikasso Найти все сообщения от Kikasso
  № 9  
Ответить с цитированием
Kikasso
 
Аватар для Kikasso

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
У вас не совсем надежно - лучше не round() делать, а floor().
Вот навалял - надежно, не совсем правда рационально.
Код:
var arr:Array = [];
var n = 100;
while (n--) arr.push(n);
var t = getTimer();

var iArr:Array = [];
for (var i = 0; i< arr.length; i++ ) iArr.push( { r:Math.random(), n:i });	
function f(a,b):Number{return (a.r - b.r);}
iArr.sort(f);
var out:Array = [];
while( iArr.length ) out.push( arr[ iArr.pop().n ]);

trace(out);
trace( 'ms: ' + (getTimer() - t )); //5ms
вот нашлась тема: http://flasher.ru/forum/showthread.p...943#post602943
Оказалось, вот этот наваляный вариант втрое быстрее, чем тот который я использовал )) splice() все-таки медленно работает.
Сравните:
Код:
var myArr:Array = [];
var n = 100;
while (n--) myArr.push(n);
var t = getTimer();
// копия 
var arr:Array = myArr.concat();
var out:Array = [];
var num:Number = arr.length;
while ( num > 0 ){
	// случайный индекс
	var rnd:Number = Math.floor (Math.random () * num );
	// выдергиваем элемент с этим индексом из массива
	out.push(arr.splice( rnd, 1 )[0] );
	// длинна массива уменьшилась
	num--;
}

trace(out);
trace( 'ms: ' + (getTimer() - t ));//14 ms
Вариант уважаемого wvxvw еще медленнее.


Последний раз редактировалось Kikasso; 27.06.2007 в 21:49.
Старый 27.06.2007, 21:56
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 10  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Вот это монументально!

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:11.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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