Форум 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=121682)

SunShadow 20.02.2009 15:17

Список уникальных значений
 
Задача простая. Получаю на входе массив ключей. Для передачи на сервер мне нужно получить список уникальных значений после фильтрации.
Ничего не придумал лучшего как создать объект и присваивать ему свойства с именами ключей. Перед присвоением можно использовать фильтр чтобы не обрабатывать лишних значений.

Код AS3:

var o:Object = new Object();
o['1']=boolean;
o['5']=boolean;
o['1']=boolean;

Далее пробегаем по свойствам нашего объекта и получаем только уникальные значения свойств
Код AS3:

for (var s:* in o){
trace (s);
}

Вопрос, может во флэше есть другой способ формирования множества уникальных значений?:umnik2:

heapKiller 20.02.2009 15:31

Причем здесь флэш?

SunShadow 20.02.2009 15:35

AS3 прошу прощения

heapKiller 20.02.2009 15:41

Вы не поняли. Я про то, что данная задача и к AS3 не имеет отношения. У Вас есть массив значений из которого нужно получить массив уникальных значений.
В чем проблема? Зачем так сложно, "свойства с именами ключей"?

Я как бы не очень много пишу на AS но например навскид для массива чисел:

Код AS3:

res = new Array();
a.sort();
while(a.length > 0){
    b = a.shift();
    if(b != res[res.length - 1]){
          res.push(b)
    }         
}

Где res - результирующий массив. a - входной.

зы. Поправочка: sort работает нескольок иначе, чем я думал. И поэтому мой код, вообще говоря, не рабочий. Но смысл из него ясен. См. описание ф-ции sort().

BlooDHounD 20.02.2009 15:54

есть, если мне память не изменяет,вид сортировки в массиве, что он вернёт уникальные элементы.

SunShadow 20.02.2009 15:56

Свойства с именами ключей позволяют не осуществлять пробежку по всему массиву полученных значений для проверки на уникальность. На сколько я помню объекты как раз и рекомендуется у большинства авторов использовать вместо массивов как менее ресурсоемкие.
В других языках есть множества SET которые позволяют получить уникальный список значений. При добавлении элемента который является неуникальным он просто игнорируется как не влияющий на конечное множество. Получается в SET скидываешь все значения, на выходе получаешь только уникальные.

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

Сообщение от BlooDHounD (Сообщение 799907)
есть, если мне память не изменяет,вид сортировки в массиве, что он вернёт уникальные элементы.

смотрел sort() и sortOn() в приписках написано что для неуникальных значений при установленном флаге уникальности сортировка не будет выполнена и функция вернет 0

heapKiller 20.02.2009 16:18

Я Вам нарисовал отбор уникальных значений в один проход

SunShadow 20.02.2009 16:22

Цитата:

Сообщение от heapKiller (Сообщение 799903)
Но смысл из него ясен. См. описание ф-ции sort().

А как по вашему выполняется сортировка? Мне известно несколько способов, но все они подразумевают многократные проходы по одному и тому же массиву чтобы выбрать нужный элемент(max или min из оставшихся не рассмотренных).:umnik2:

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

Сообщение от heapKiller (Сообщение 799920)
Я Вам нарисовал отбор уникальных значений в один проход

сам sort в любом случае будет внутренними механизмами но делать ту же самую сортировку(методом пузырька или каким еще не важно). Просто от нас она скрыта)

heapKiller 20.02.2009 16:31

Методов сортировки, насколько я помню, 3. Основных. И у Вас будет k+1 проходов по массиву (где к - проходов при сортировке). При этом я не думаю что внутренний способ для сортировки array() менее эффективен чем применяемые повсеместно.
И вы думаете что поиск по имени свойства более эффективен? Там то-же самое.

Только вот смысл несколько меняется. У Вас значение становится переменной, а оно должно оставаться значением.

Короче в любом случае у Вас будут некие затраты на индексирование.

wvxvw 20.02.2009 18:38

Код AS1/AS2:

var arr:Array = ["a", "b", "b", "c", "a"];
var i:int = arr.length;
// If you specify a value of 4 or Array.UNIQUESORT
// for the sortOptions argument of the ...args parameter
// and two or more elements being sorted have identical
// sort fields, Flash returns a value of 0 and does not
// modify the array
arr.sort(Array.UNIQUESORT);
trace(arr);
var hash:Dictionary = new Dictionary();
while (i--)
{
        hash[arr[i]] ? arr.splice(i, 1) : hash[arr[i]] = i;
}
trace(arr);

Ну только его развернет, но я думаю это не принципиально? Вернее, последние значения будут подобраны первыми, а первые значения не учтуться


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

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