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

Fillini 16.06.2010 13:37

Сравнение двух массивов
 
Здравствуйте. Не подкинете ли алгоритм сравнения двух массивов?
Т.е Есть массив А и Б. Сравниваем. Получаем массив В который содержит элементы из А не входящия в Б.
Весь гугл перерыл

Код AS3:

 
А = ['a','b','c','d'];
Б = ['b','d'];
 
//сравниваем
 
В = ['a','c'];


Партизан 16.06.2010 13:58

немного сыро... возвращает уникальные элементы первого массива не входящие во второй.
Код AS3:

var a:Array = ["a", "b","c","z","E","g"];
var b:Array = ["a", "e","Z"];
trace(returnUnique(a,b))
 
function returnUnique(a:Array,b:Array):Array{
    var arr:Array = [];                                       
    for each(var i:Object in a) {
        if (b.indexOf(i) == -1) {
            arr.push(i);
        }
    }
    return arr;
}


i.o. 16.06.2010 14:02

Код AS3:

 
var a:Array = ['a','b','c','d'];
var b:Array = ['b','d'];
 
var c:Array = getSubtraction( a, b );
 
 
trace( c );
 
 
 
function getSubtraction( arrA:Array, arrB:Array ):Array
{
        var arrOut:Array = [];
 
        var _isFound:Boolean;
 
        var i:int;
        var j:int;
 
        var li:int = arrA.length;
        var lj:int = arrB.length;
 
        for( i=0; i < li; i+=1 )
        {
                _isFound = false;
 
                for( j=0; j < lj; j+=1 )
                {
                        if( arrA[i] === arrB[j] )
                        {
                                _isFound = true;
                                break;
                        }
                }
 
                if( !_isFound )
                {
                        arrOut.push( arrA[i] );
                }
        }
 
        return arrOut;
}


PgeorgyV 16.06.2010 14:03

Код AS3:

trace(diff([1, 2, 3, 4, 5, 6], [2, 4, 6]).join(' '));
 
public function diff(a:Array, b:Array):Array {
        var c:Array = [];
        var l:int = 0;
        var o:Object;
        for (var i:int = 0, j:int = a.length; i < j; i++) {
                o = a[i];
                if (b.indexOf(o) == -1) {
                        c[l++] = o;
                }
        }
        return c;
}


Сайлас 16.06.2010 14:06

Цитата:

Сообщение от i.o. (Сообщение 915866)
Код AS3:

var arrOut:Array = [];
var _isFound:Boolean;
 
var li:int = A.length;
var lj:int = B.length;
 
var i:int;
var j:int;
 
for( i=0; i < li; i+=1 )
{
    _isFound = false;
 
    for( j=0; j < lj; j+=1 )
    {
          if( А[i] === B[j] )
          {
              _isFound = true;
              break;
          }
    }
 
    if( !_isFound )
    {
        arrOut.push( A[i] );
    }
}
 
trace( arrOut );


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

Цитата:

Код AS3:

function returnUnique(a:Array,b:Array):Array{
    var arr:Array = [];                                       
    for each(var i:Object in a) {
        if (b.indexOf(i) == -1) {
            arr.push(i);
        }
    }
    return arr;
}


А этот код никак не поддержит дублирующиеся элементы, а если дублирующиеся элементы не нужны, то тогда лучше объект использовать - поиск по ключу наамного быстрее

i.o. 16.06.2010 14:17

Цитата:

Можно написать более оптимальный алгоритм, если массивы будут отсортированы, кстати.
можно, тогда j будет просто начинаться не с нуля, а с i

Партизан 16.06.2010 14:23

Цитата:

Сообщение от Сайлас (Сообщение 915869)
А этот код никак не поддержит дублирующиеся элементы

Если я все правильно понял из задачи топикстартера, именно это и требовалось :drinks:

Сайлас 16.06.2010 14:31

Цитата:

Сообщение от Партизан (Сообщение 915885)
Если я все правильно понял из задачи топикстартера, именно это и требовалось :drinks:

Ну тогда лучше не массивы, а объекты использовать...

silin 16.06.2010 14:43

Код AS3:

var a:Array = ["a", "b","c","z","E","g"];
var b:Array = ["a", "e","Z"];
 
var noMatch:Function = function(element:*, index:int, arr:Array):Boolean
{
        return (this as Array).indexOf(element) < 0;
}
 
var difArr:Array = a.filter(noMatch, b);
trace( "difArr : " + difArr );


Fillini 16.06.2010 14:54

Спасибо. Все работает. Да именно не дублирующиеся. Использую алгоритм партизана.


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

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