;================================================================================================== ; Function Name: _GetIntersection($Set1, $Set2 [, $GetAll=0 [, $Delim=Default]]) ; Description:: Aus 2 gegebenen Mengen werden ermittelt ; - die Schnittmenge (Elemente, die in beiden Mengen enthalten sind) ; - die Differenzmenge 1 (Elemente, die nur in Menge 1 vorkommen) ; - die Differenzmenge 2 (Elemente, die nur in Menge 2 vorkommen) ; Parameter(s): $Set1 Menge 1 (1D-Array od. Trennzeichenbasierter String) ; $Set2 Menge 2 (1D-Array od. Trennzeichenbasierter String) ; optional: $GetAll 0 - mehrfach vorhandenen Elemente der Differenzmengen werden einmalig ausgegeben (Standard) ; 1 - mehrfach vorhandenen Elemente der Differenzmengen werden komplett ausgegeben ; optional: $Delim Trennzeichen für String (Standard 'Default' nutzt Zeichen aus Opt("GUIDataSeparatorChar")) ; Return Value(s): Erfolg 2D-Array [i][0]=Schnittmenge ; [i][1]=Differenzmenge 1 ; [i][2]=Differenzmenge 2 ; Fehler -1 @error als Array übergebene Menge ist kein 1D-Array ; Note: Der Vergleich ist Case-Sensitiv! - Ein Array-Element [9] ist also <> String '9'!! ; Author(s): BugFix (bugfix@autoit.de) ;================================================================================================== Func _GetIntersection(ByRef $Set1, ByRef $Set2, $GetAll=0, $Delim=Default) Local $o1 = ObjCreate("System.Collections.ArrayList") Local $o2 = ObjCreate("System.Collections.ArrayList") Local $oUnion = ObjCreate("System.Collections.ArrayList") Local $oDiff1 = ObjCreate("System.Collections.ArrayList") Local $oDiff2 = ObjCreate("System.Collections.ArrayList") Local $tmp, $i If $GetAll <> 1 Then $GetAll = 0 If $Delim = Default Then $Delim = Opt("GUIDataSeparatorChar") If Not IsArray($Set1) Then If Not StringInStr($Set1, $Delim) Then $o1.Add($Set1) Else $tmp = StringSplit($Set1, $Delim, 1) For $i = 1 To UBound($tmp) -1 $o1.Add($tmp[$i]) Next EndIf Else If UBound($Set1, 0) > 1 Then Return SetError(1,0,-1) For $i = 0 To UBound($Set1) -1 $o1.Add($Set1[$i]) Next EndIf If Not IsArray($Set2) Then If Not StringInStr($Set2, $Delim) Then $o2.Add($Set2) Else $tmp = StringSplit($Set2, $Delim, 1) For $i = 1 To UBound($tmp) -1 $o2.Add($tmp[$i]) Next EndIf Else If UBound($Set2, 0) > 1 Then Return SetError(1,0,-1) For $i = 0 To UBound($Set2) -1 $o2.Add($Set2[$i]) Next EndIf For $tmp In $o1 If $o2.Contains($tmp) And (Not $oUnion.Contains($tmp)) Then $oUnion.Add($tmp) Next For $tmp In $o2 If $o1.Contains($tmp) And (Not $oUnion.Contains($tmp)) Then $oUnion.Add($tmp) Next For $tmp In $o1 If $GetAll Then If Not $oUnion.Contains($tmp) Then $oDiff1.Add($tmp) Else If Not $oUnion.Contains($tmp) And Not $oDiff1.Contains($tmp) Then $oDiff1.Add($tmp) EndIf Next For $tmp In $o2 If $GetAll Then If Not $oUnion.Contains($tmp) Then $oDiff2.Add($tmp) Else If Not $oUnion.Contains($tmp) And Not $oDiff2.Contains($tmp) Then $oDiff2.Add($tmp) EndIf Next Local $UBound[3] = [$oDiff1.Count,$oDiff2.Count,$oUnion.Count], $max = 1 For $i = 0 To UBound($UBound) -1 If $UBound[$i] > $max Then $max = $UBound[$i] Next Local $aOut[$max][3] If $oUnion.Count > 0 Then $i = 0 For $tmp In $oUnion $aOut[$i][0] = $tmp $i += 1 Next EndIf If $oDiff1.Count > 0 Then $i = 0 For $tmp In $oDiff1 $aOut[$i][1] = $tmp $i += 1 Next EndIf If $oDiff2.Count > 0 Then $i = 0 For $tmp In $oDiff2 $aOut[$i][2] = $tmp $i += 1 Next EndIf Return $aOut EndFunc ;==>_GetIntersection