2009-10-25 2 views
1

배열 컬렉션을 교차하는 방법을 찾고 있습니다.플렉스 : 두 배열 컬렉션의 차이 설정

하나의 컬렉션 : allItems 및 다른 subSet이 있습니다. 내가 subSet에 존재하지 않는 모든 항목이 저장됩니다 다른 ArrayCollection을 만들고 싶습니다. 이것을 할 수있는 방법이 있습니까?

+1

질문 제목은 오해의 소지가 있습니다. -1. 교차로가 아니라 차액을 요구하고 있습니다. –

답변

1

다른 항목에없는 항목 모음을 가져 오려면 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 
} 
+0

'ArrayCollection'에'add' 메소드가 있나요? 'addItem'하지 않아야합니까? – Amarghosh

+0

네 말이 맞아. 고정 : –

+0

차이점과 iterection에 대해 : A와 B를 두 세트라고합시다 ... A와 B의 교차점은 A가 B를 빼고 A가 비어있는 경우에만 ... B가 A의 하위 집합 인 경우 그들의 교차점은 B이고 A - B는 A에 대한 B의 보수입니다 ... – 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)); 

참고. 하위 집합에 수퍼 집합 개체와 동일한 속성 값을 가진 다른 개체가 포함되어 있으면 해당 속성을 별도로 비교해야합니다.

6

작동 대답은 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

+1 최적화 – Amarghosh