Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Получить индекс элемента при Array::pop() (http://www.flasher.ru/forum/showthread.php?t=192297)

AlexLucas 11.01.2013 19:31

Получить индекс элемента при Array::pop()
 
Доброго времени суток.
Есть массив, вроде такого:
Код AS3:

var arr:Array = new Array();
arr[-4] = "one";
arr[-2] = "two";
arr[-1] = "three";
arr[5] = "four";
arr[7] = "five";
arr[8] = "six";
arr[10] = "seven";

Массив может начинаться с любого отрицательного индекса, также индексы рандомные, нельзя расчитать сколько undefined элементов будет.

Мне нужно достать первый элемент с конца, который не undefined, и его индекс.

Но не знаю как получить индекс этого элемента.

iflamberg 11.01.2013 19:33

Шито? массив с отрицательными индексами? И что, .pop() будет нормально работать и удалять элементы по отрицательному индексу?

Код AS3:

var a:Array = [];
a[-1]="some";
a[0]="balbla";
trace (a.length); //1
trace (a.pop()); //balbla
trace (a.pop()); //undefined


КорДум 11.01.2013 19:34

Array#indexOf().
Отрицательные индексы преобразовываются в строки, в результате получается от 0 индекса и выше - индексированный массив, а от "-1" и ниже - ассоциативный.

iflamberg 11.01.2013 19:38

Быдлокод же. Использовать тогда уж надо или Object/Dictionary или тупо сместить точку отчета, чтобы небыло отрицательных элементов. Типа массив [-50;50] => [0,100], arrayIndex = realIndex + 50.

AlexLucas 11.01.2013 19:42

Да, сори, невнимательный ;)
Но проблема осталась, пока единственная идея - взять примерный минимальный индекс и в цикле делать проверку на undefined.

Цитата:

Типа массив [-50;50] => [0,100], arrayIndex = realIndex + 50.
А как я тебе его смещу, если я не в курсе на сколько смещать?

Насчёт Object - как я узнаю какой элемент последний?

С Dictionary пока не работал, если найдётся минимальный примерчик решения, буду очень благодарен :)

iflamberg 11.01.2013 19:49

Цитата:

А как я тебе его смещу, если я не в курсе на сколько смещать?
Цитата:

взять примерный минимальный индекс
Ну как можно не знать, какой у тебя будет минимальный индекс, а?
Ну если уж все так плохо, то надо брать Object и расширять его своими функциями,типа insert, push, pop, getLength() и т.д.

caseyryan 11.01.2013 19:51

Цитата:

Насчёт Object - как я узнаю какой элемент последний?
Никак. Он не хранит последовательности элементов. Так же как и Dictionary.

wvxvw 11.01.2013 21:08

Можно использовать функцию, которая трансформирует индекс в реальный индекс в массиве, тогда смещение становится "виртуальным", т.е. мы только двигаем нулевой индекс, (но не элемент по нулевому индексу), тогда функция "трансформатор" будет всегда читать нулевой индекс и прибавлять / отнимать чтобы получить реальный индекс.

Например, алгоритм записи по индексу:
1. Проверить вышли ли мы за пределы массива (сложить индекс с реальным индексом нулевого элемента, если результат меньше 0 или больше реальной длины массива - то вышли).
2. Если вышли - посчитать разницу на сколько вышли,
2.а. прибавить разницу к нулевому индексу,
2.б. прибавить необходимое количество пустых элементов к массиву.
3. заменить элемент по индексу на новый.

Другой вариант - использовать два массива. Считать индексы во втором массиве отрицательными.

iflamberg 11.01.2013 22:58

Цитата:

Другой вариант - использовать два массива. Считать индексы во втором массиве отрицательными.
Изящненько.

gloomyBrain 12.01.2013 00:37

Я бы использовал связанный список + хэш. В хэше бы хранил пары "индекс - элемент", в связааном списке - сами элементы в текущей последовательности. При таком раскладе получаем быструю вставку до/после определенного элемента + доступ по индексам. Пример приводить не буду =)


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

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