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

Ckazkatmn 20.01.2010 23:03

как удалить из массива все повторяющиесся значения!!!
 
есть массив
Код AS3:

var test:Array=new Array(1,2,7,3,4,1,8,5,6,2,7,8,9,4);

нужно из этого получить(создать новый или как то из этого удалить) массив с не повторяющимся значениями...
Заранее спасибо!

murz 20.01.2010 23:50

Код AS3:

        var test:Array = [1, 1, 99,5,60,0,0,2,0,10,10,1,99, 2,45,2];
                trace( "test : " , test );
                for (var i:int = 0; i < test.length; i++) {
                        for (var j:int = 0; j < test.length; j++) {
                                if (i!= j && test[i] == test[j]) {
                                        test.splice(j, 1);
                                        i--;
                                }
 
                        }
                }
                        trace("test : ",test, "len:", test.length);
//test :  1,99,5,6,0,2,10,45 len: 8


wvxvw 21.01.2010 00:03

Вы о чем это вообще...
Код AS3:

var test:Array = [1, 2, 7, 3, 4, 1, 8, 5, 6, 2, 7, 8, 9, 4];
var i:int = test.length;
var val:int;
var j:int;
var result:Array = [];
while (i--)
{
        val = test[i];
        if (result.indexOf(val) > -1) continue;
        result.push(val);
}
trace(result);

EDIT:
Если извесно, что повторяющиеся значения однотипные (т.е. например массив содержит много единиц, а все остальные значения всегда уникальные), то можно это оптимизировать записывая найденные неуникальные значения в Dictionary и проверять их соответственно.

udaaff 21.01.2010 00:12

:quiet:
Код AS3:

var test:Array = [];
for (var i:int = 0; i < 1e5; i++)
{
        test.push(Math.floor(Math.random() * 10000));
}
 
var t:Number = getTimer();
 
var o:Object = {};
test = test.filter(callback);
o = null;
 
trace(test.length, getTimer() - t); // 9999 23
 
function callback(item:*, index:int, array:Array):Boolean
{
        return o[item] ? false : o[item] = true;
}


mayakwd 21.01.2010 03:30

Код AS3:

                private function removeDuplicates(inArray : Array) : Array {
                        return inArray.filter(_removeDuplicatesFilter);
                }
 
                private function _removeDuplicatesFilter(e : *, i : int, inArray : Array) : Boolean {
                        return (i == 0) ? true : inArray.lastIndexOf(e, i - 1) == -1;
                }


Ckazkatmn 21.01.2010 11:19

большое всем спасибо !!!

udaaff 21.01.2010 12:24

Код AS3:

var test:Array = [];
for (var i:int = 0; i < 1e5; i++)
{
        test.push(Math.floor(Math.random() * 10000));
}
 
var t:Number = getTimer();
 
var o:Object = {};
test = test.filter(callback);
o = null;
 
trace(getTimer() - t); // 21
 
function callback(item:*, index:int, array:Array):Boolean
{
        return o[item] ? false : o[item] = true;
}


Код AS3:

var test:Array = [];
for (var i:int = 0; i < 1e5; i++)
{
        test.push(Math.floor(Math.random() * 10000));
}
 
var t:Number = getTimer();
i = test.length;
var val:int;
var j:int;
var result:Array = [];
while (i--)
{
        val = test[i];
        if (result.indexOf(val) > -1) continue;
        result.push(val);
}
trace(getTimer() - t); // 5296



Код AS3:

var test:Array = [];
for (var i:int = 0; i < 1e5; i++)
{
        test.push(Math.floor(Math.random() * 10000));
}
 
var t:Number = getTimer();
test = removeDuplicates(test);
trace(getTimer() - t); // 9634
 
function removeDuplicates(inArray : Array) : Array {
        return inArray.filter(_removeDuplicatesFilter);
}
 
function _removeDuplicatesFilter(e : *, i : int, inArray : Array) : Boolean {
        return (i == 0) ? true : inArray.lastIndexOf(e, i - 1) == -1;
}




Код AS3:

var test:Array = [];
for (var i:int = 0; i < 1e5; i++)a
{
        test.push(Math.floor(Math.random() * 10000));
}
 
var t:Number = getTimer();
for (i = 0; i < test.length; i++) {
        for (var j:int = 0; j < test.length; j++) {
                if (i!= j && test[i] == test[j]) {
                        test.splice(j, 1);
                        i--;
                }
 
        }
}
trace(getTimer() - t);
// Error: Error #1502: A script has executed for longer than the default timeout period of 15 seconds.


Fernando Costa 21.01.2010 13:16

Цитата:

Сообщение от Ckazkatmn (Сообщение 880769)
есть массив
Код AS3:

var test:Array=new Array(1,2,7,3,4,1,8,5,6,2,7,8,9,4);

нужно из этого получить(создать новый или как то из этого удалить) массив с не повторяющимся значениями...
Заранее спасибо!

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

wvxvw 21.01.2010 16:48

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

Crenth 25.01.2010 22:59

Цитата:

Сообщение от Ckazkatmn (Сообщение 880769)
есть массив
Код AS3:

var test:Array=new Array(1,2,7,3,4,1,8,5,6,2,7,8,9,4);

нужно из этого получить(создать новый или как то из этого удалить) массив с не повторяющимся значениями...
Заранее спасибо!

Код AS3:

test.sort();
var j:int=1;
while ((test.length>1) && (j<test.length)) {
        if (test[j]==test[j-1]) test.splice(j,1); else j=j+1;
}

кажется, пофигу, что сортировать тут

Котяра 26.01.2010 11:39

если порядок не важен - приводим к хэшу.
Код AS3:

var test:Array = new Array(1, 2, 7, 3, 4, 1, 8, 5, 6, 2, 7, 8, 9, 4);
                var len:int = test.length;
                var hash:Object = { };
                        for (var i:int = 0; i < len; i++)
                        {
                                hash[test[i]] = i;
                        }
 
                        // доступ
                        for (var name:String in hash)
                        {
                                trace("index: "+hash[name] + " value:"+name);
                        }



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

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