2009-10-25 2 views
1

Je recherche une méthode pour recouper mes collections de tableaux.Flex: Définir la différence de deux collections de tableaux

J'ai une collection: allItems et un autre sous-ensemble. Je veux créer un autre ArrayCollection où tous les éléments qui n'existent pas dans subSet seront stockés. Y a-t-il un moyen de faire cela?

+1

Le titre de la question est trompeur, -1. Vous demandez la différence d'ensemble, pas d'intersection. –

Répondre

1

Pour obtenir une collection d'éléments qui ne sont pas dans un autre, vous avez besoin d'un algorithme set difference (allItems moins sous-ensemble).

public function minus(a:ArrayCollection, b:ArrayCollection):ArrayCollection { 
    var result:ArrayCollection = new ArrayCollection() 

    for each (i in a) { 
     if (!b.contains(i)) { 
      result.addItem(i) 
     } 
    } 

    return result 
} 
+0

Existe-t-il une méthode 'add' dans' ArrayCollection'? Ne devrait-il pas être «addItem»? – Amarghosh

+0

Oui, vous avez raison. Fixe :) –

+0

à propos de la différence et de l'itération: Soit A et B deux ensembles ... l'intersection de A et B est égale à A moins B si et seulement si A est vide ... si B est un sous-ensemble de A, alors leur intersection est B, et A moins B est le complément de B par rapport à A ... – back2dos

1
var allLength:Number = allItems.length; 
var intersection:ArrayCollection = new ArrayCollection(); 
for(var i:Number = 0; i < allLength; i++) 
    if(subSet.getItemIndex(allItems.getItemAt(i)) == -1) 
    intersection.addItem(allItems.getItemAt(i)); 

Notez que cela ne fonctionnera que si le sous-ensemble contient les mêmes objets que le super set. Si le sous-ensemble contient des objets différents avec les mêmes valeurs de propriétés que celles de l'objet super-ensemble, vous devrez comparer leurs propriétés séparément.

6

réponse apportée par eemeli ... voici une implémentation alternative optimisée pour la vitesse (accès au tableau au lieu des appels) et l'évolutivité (l'approche fournit O (m + n) au lieu de O (m * n)) ...

public static function difference(a:ArrayCollection, b:ArrayCollection):ArrayCollection { 
    var entry:*, map:Dictionary = new Dictionary(), intersection:Array = []; 
    for each (entry in a.source) map[entry] = entry; 
    for each (entry in b.source) delete map[entry]; 
    for each (entry in map) intersection.push(entry); 
    return new ArrayCollection(intersection); 
} 
+1

+1 pour l'optimisation – Amarghosh

Questions connexes