배열 컬렉션을 교차하는 방법을 찾고 있습니다.플렉스 : 두 배열 컬렉션의 차이 설정
하나의 컬렉션 : allItems 및 다른 subSet이 있습니다. 내가 subSet에 존재하지 않는 모든 항목이 저장됩니다 다른 ArrayCollection을 만들고 싶습니다. 이것을 할 수있는 방법이 있습니까?
배열 컬렉션을 교차하는 방법을 찾고 있습니다.플렉스 : 두 배열 컬렉션의 차이 설정
하나의 컬렉션 : allItems 및 다른 subSet이 있습니다. 내가 subSet에 존재하지 않는 모든 항목이 저장됩니다 다른 ArrayCollection을 만들고 싶습니다. 이것을 할 수있는 방법이 있습니까?
다른 항목에없는 항목 모음을 가져 오려면 set difference 알고리즘 (allItems에서 subSet 제외)이 필요합니다. 부분 집합은 슈퍼 세트와 같은 객체를 포함하는 경우에만 동작합니다
는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
}
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));
참고. 하위 집합에 수퍼 집합 개체와 동일한 속성 값을 가진 다른 개체가 포함되어 있으면 해당 속성을 별도로 비교해야합니다.
작동 대답은 eemeli가 제공합니다 ... 여기에는 속도 (호출 대신 배열 액세스) 및 확장 성 (접근 방식이 O (m * n) 대신 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 최적화 – Amarghosh
질문 제목은 오해의 소지가 있습니다. -1. 교차로가 아니라 차액을 요구하고 있습니다. –