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

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

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

Регистрация: Jul 2008
Сообщений: 912
По умолчанию Создание массива на основе индексов имеющегося массива

Постоянно у меня куча разнообразных задач с массивами - одна краше другой и не каждую могу решить сам к сожалению((( Но как хорошо, что есть любимый форум, а на нём умные люди всегда готовые помочь и конечно повысить скил "репутация"! Подмазался, а теперь к делу:

Вот массив объектов, назовём его ArrayX:
Код AS3:
5 3 0, 0 4 1, 6 5 2, 1 6 3, 6 5 2, 0 4 1, 6 5 15, 1 6 3, 7 7 4, 2 8 5, 7 7 4, 1 6 3, 7 7 4, 2 8 5, 8 9 6, 3 10 7
Нужно создать новый числовой массив из его индексов, но не просто подряд идущих индексов.
Каждый элемент этого массива содержит три числа, некоторые элементы полностью одинаковы, так вот: если попадается элемент, который уже встречался, то в новый массив передаётся индекс первого попавшегося и все элементы, идущие за уже попадавшимся, сдвигаются на единицу к началу массива.
Должен получиться вот такой массив:
Код AS3:
0, 1, 2, 3, 2, 1, 4, 3, 5, 6, 5, 3, 5, 6, 7, 8
Думаю, сначала нужно отобрать все первые попавшиеся уникальные элементы в отдельный массив, это может помочь.(эту часть кода я уже написал)
Вот все уникальные элементы в нужном порядке.

Код AS3:
5 3 0, 0 4 1, 6 5 2, 1 6 3, 6 5 15, 7 7 4, 2 8 5, 8 9 6, 3 10 7
Например здесь индекс элемента "6 5 2" это 2, в массиве ArrayX он попадается несколько раз, каждый раз когда он попадается - в новый массив нужно записать "2", дальше идёт "1 6 3" у него индекс 3, каждый раз, когда он попадается в массиве ArrayX - в новый массив пишем "3" и т.д.


Последний раз редактировалось Sintesis; 07.07.2011 в 02:37.
Старый 07.07.2011, 02:45
MXPain вне форума Посмотреть профиль Отправить личное сообщение для MXPain Найти все сообщения от MXPain
  № 2  
Ответить с цитированием
MXPain
 
Аватар для MXPain

Регистрация: Dec 2008
Сообщений: 305
Записей в блоге: 1
т.е индекс это обязательно последнее число в строке?

Старый 07.07.2011, 02:48
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 3  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
Цитата:
Сообщение от MXPain Посмотреть сообщение
т.е индекс это обязательно последнее число в строке?
Нет конечно, например у "6 5 15" индекс 4, у "7 7 4" - 5, у "2 8 5" - 6 что видно по последнему приведённому мной массиву.
Ещё раз его повторю:
Код AS3:
5 3 0, 0 4 1, 6 5 2, 1 6 3, 6 5 15, 7 7 4, 2 8 5, 8 9 6, 3 10 7


Последний раз редактировалось Sintesis; 07.07.2011 в 02:53.
Старый 07.07.2011, 02:49
MXPain вне форума Посмотреть профиль Отправить личное сообщение для MXPain Найти все сообщения от MXPain
  № 4  
Ответить с цитированием
MXPain
 
Аватар для MXPain

Регистрация: Dec 2008
Сообщений: 305
Записей в блоге: 1
а, ты про индексе в массиве)

Добавлено через 21 минуту
ну сначала наверное так
Код AS3:
var pre_res:Array = new Array();
for(i=0;i < ArrayX.length;i++)
{
   var ar:Array = ArrayX[i].split(" ");
   var cur_ind:int = parseInt(ar[2]);
 
     pre_res.push(cur_ind);
 
}
Добавлено через 52 минуты
а потом уже по массиву этому пробежаться
и сделать еще массив куда конечный результат будет пихаться

Код AS3:
var res:Array = new Array();
var tmp:Array;
for(i=0;i < pre_res.length;i++)
{
   if(i==0)
   {
    res.push({indexOf(pre_res[i]), pre_res[i]});
   }
   else
  {
    var isRepeat:Boolean;
    for(j=0;j < res.length;j++)
   {
    if(pre_res[i]==res[j][1])
    { 
       res.push({res[j][0], res[j][1]});
       isRepeat=true;
    }
 
   }
   if(!isRepeat)
       res.push({indexOf(pre_res[i]), pre_res[i]});
 
  }
 
}
Добавлено через 1 час 10 минут
надеюсь в общих чертах донес, а то устал и голова раскалывается


Последний раз редактировалось MXPain; 07.07.2011 в 03:56.
Старый 07.07.2011, 04:02
AtomicFlasher вне форума Посмотреть профиль Отправить личное сообщение для AtomicFlasher Найти все сообщения от AtomicFlasher
  № 5  
Ответить с цитированием
AtomicFlasher

Регистрация: Jul 2011
Сообщений: 11
Код AS3:
function f(s:Vector.<String>):Vector.<int>
{
	var n:int;
	var uniqueString:Vector.<String> = new Vector.<String>();
	var result:Vector.<int> = new Vector.<int>();
 
	for (var i:int = 0; i < s.length; i++)
	{
		n = -1;		
		for (var j:int = 0; j < uniqueString.length; j++)
		if (s[i] == uniqueString[j]) {n = j; break;}
 
		if (n == -1)
		{
			uniqueString.push(s[i]);
			result.push(uniqueString.length-1);
		}
		else result.push(n);
 
	}
	return result;
}

Старый 07.07.2011, 15:56
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 6  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
Во спасибо сейчас проверю, оба способа.
MXPain, а что это за конструкция: res.push({indexOf(pre_res[i]), pre_res[i]}); ?
Так проверил способ AtomicFlasher'а он вернул вот такой массив
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Зачем это? Не понятно. И вообще там цикл for в цикле for без тела вот этот:
Код AS3:
for (var j:int = 0; j < uniqueString.length; j++)
это нормально?
MXPain, конструкция res.push({indexOf(pre_res[i]), pre_res[i]}); не работает, выдаёт ошибку.
И зачем ты сначала вырезал последние цифры элементов массива ArrayX? Я же сказал, они ни как не влияют на результат.


Последний раз редактировалось Sintesis; 07.07.2011 в 23:48.
Старый 07.07.2011, 16:17
MXPain вне форума Посмотреть профиль Отправить личное сообщение для MXPain Найти все сообщения от MXPain
  № 7  
Ответить с цитированием
MXPain
 
Аватар для MXPain

Регистрация: Dec 2008
Сообщений: 305
Записей в блоге: 1
Цитата:
а что это за конструкция: res.push({indexOf(pre_res[i]), pre_res[i]});
кладем в массив результатов индекс элемента и его значение, так чем мой вариант то не устраивает?

Добавлено через 1 минуту
значение нужно для вспомогательных целей потом можно в массиве оставить только индексы

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

Регистрация: Jul 2008
Сообщений: 912
Ещё ра з повторю что нужно. Есть массив ArrayX (сделаю его покороче для лучшей наглядности):
Код AS3:
5 3 0, 0 4 1, 6 5 2, 1 6 3, 6 5 2, 0 4 1, 6 5 15, 1 6 3, 7 7 4, 2 8 5, 7 7 4
нужно получить:
Код AS3:
0, 1, 2, 3, 2, 1, 4, 3, 5, 6, 5
вспомогательный массив:
Код AS3:
5 3 0, 0 4 1, 6 5 2, 1 6 3, 6 5 15, 7 7 4, 2 8 5
Добавлено через 11 минут
Цитата:
Сообщение от MXPain Посмотреть сообщение
res.push({indexOf(pre_res[i]), pre_res[i]}); кладем в массив результатов индекс элемента и его значение, так чем мой вариант то не устраивает?
Такая конструкция выдаёт ошибку (((
Цитата:
значение нужно для вспомогательных целей
А, тоесть ты сделал из этого массива - числовой массив?
Вроде в общем всё правильно сделано, но загвоздка в этом res.push({indexOf(pre_res[i]), pre_res[i]}) тут ты пытаешься создать массив объектов?

Добавлено через 53 минуты
Цитата:
Сообщение от MXPain Посмотреть сообщение
кладем в массив результатов индекс элемента и его значение
Ага понял, тоесть вот так

Код AS3:
res.push(pre_res.indexOf(pre_res[i]), pre_res[i]);
Эх, и так не получается, потому, что так создаётся числовой массив...


Последний раз редактировалось Sintesis; 07.07.2011 в 17:54.
Старый 07.07.2011, 17:43
nuToH вне форума Посмотреть профиль Отправить личное сообщение для nuToH Найти все сообщения от nuToH
  № 9  
Ответить с цитированием
nuToH
 
Аватар для nuToH

Регистрация: Mar 2006
Адрес: Ростов-на-Дону
Сообщений: 80
могу предложить еще вариант =)
Код AS3:
var a:Array = ["5 3 0", "0 4 1", "6 5 2", "1 6 3", "6 5 2", "0 4 1", "6 5 15", "1 6 3", "7 7 4", "2 8 5", "7 7 4", "1 6 3", "7 7 4", "2 8 5", "8 9 6", "3 10 7"];
var b:Array = [].concat(a);//уникальные элементы
 
var result:Array = [];
var len:int = a.length;
for(var i = 0; i < len; i++) {
	while(b.indexOf(b[i], i+1) != -1) {
		b.splice(b.indexOf(b[i], i+1), 1);
	}
	result.push(b.indexOf(a[i]));
}
 
 
trace(b);
trace(result);

Старый 07.07.2011, 17:56
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 10  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
Цитата:
Сообщение от nuToH Посмотреть сообщение
могу предложить еще вариант =)
О отлично попробую, но вариант MXPain'а заинтересовал, хочу разобраться в нём.

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

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

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


 


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


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