Flex: установить разность двух коллекций массивов - PullRequest
1 голос
/ 25 октября 2009

Я ищу способ пересечения моих коллекций массивов.

У меня есть одна коллекция: allItems и другая подсеть. Я хочу создать другую коллекцию ArrayCollection, в которой будут храниться все элементы, которые не существуют в подсети Есть ли способ сделать это?

Ответы [ 3 ]

6 голосов
/ 25 октября 2009

рабочий ответ, предоставленный eemeli ... вот альтернативная реализация, оптимизированная для скорости (доступ к массиву вместо вызовов) и масштабируемости (подход обеспечивает O (m + n) вместо O (m * n)) ... 1001 *

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 голос
/ 25 октября 2009
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));

Обратите внимание, что это будет работать, только если подмножество содержит те же объекты, что и надмножество. Если подмножество содержит разные объекты с теми же значениями свойств, что и у объекта супернабора, вам придется сравнивать их свойства по отдельности.

1 голос
/ 25 октября 2009

Чтобы получить коллекцию предметов, не принадлежащих другому, необходим алгоритм Разница набора (allItems минус подсеть).

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...