Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Создание массива на основе индексов имеющегося массива (http://www.flasher.ru/forum/showthread.php?t=159944)

Sintesis 07.07.2011 02:32

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

Вот массив объектов, назовём его 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" и т.д.

MXPain 07.07.2011 02:45

т.е индекс это обязательно последнее число в строке?

Sintesis 07.07.2011 02:48

Цитата:

Сообщение от MXPain (Сообщение 1009426)
т.е индекс это обязательно последнее число в строке?

Нет конечно, например у "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


MXPain 07.07.2011 02:49

а, ты про индексе в массиве)

Добавлено через 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 минут
надеюсь в общих чертах донес, а то устал и голова раскалывается

AtomicFlasher 07.07.2011 04:02

Код 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;
}


Sintesis 07.07.2011 15:56

Во спасибо сейчас проверю, оба способа.
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? Я же сказал, они ни как не влияют на результат.

MXPain 07.07.2011 16:17

Цитата:

а что это за конструкция: res.push({indexOf(pre_res[i]), pre_res[i]});
кладем в массив результатов индекс элемента и его значение, так чем мой вариант то не устраивает?

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

Sintesis 07.07.2011 16:33

Ещё ра з повторю что нужно. Есть массив 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 (Сообщение 1009621)
res.push({indexOf(pre_res[i]), pre_res[i]}); кладем в массив результатов индекс элемента и его значение, так чем мой вариант то не устраивает?

Такая конструкция выдаёт ошибку (((
Цитата:

значение нужно для вспомогательных целей
А, тоесть ты сделал из этого массива - числовой массив?
Вроде в общем всё правильно сделано, но загвоздка в этом res.push({indexOf(pre_res[i]), pre_res[i]}) тут ты пытаешься создать массив объектов?

Добавлено через 53 минуты
Цитата:

Сообщение от MXPain (Сообщение 1009621)
кладем в массив результатов индекс элемента и его значение

Ага понял, тоесть вот так

Код AS3:

res.push(pre_res.indexOf(pre_res[i]), pre_res[i]);

Эх, и так не получается, потому, что так создаётся числовой массив...

nuToH 07.07.2011 17:43

могу предложить еще вариант =)
Код 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);


Sintesis 07.07.2011 17:56

Цитата:

Сообщение от nuToH (Сообщение 1009668)
могу предложить еще вариант =)

О отлично попробую, но вариант MXPain'а заинтересовал, хочу разобраться в нём.


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

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