- Offizieller Beitrag
Hi,
es kommt häufiger vor, dass wir 2 verschiedene Mengen haben, die untersucht werden müssen auf gemeinsame oder unterschiedliche Elemente (Vergleichen von Arrays oder Strings).
Mit der Funktion _GetIntersection( ) werden aus 2 gegebenen Mengen,
- die als 1D-Array oder Trennzeichenbasierter String übergeben werden
- die Schnittmenge (gemeinsame Elemente)
- die Differenzmenge 1 (nur in Menge 1 enthaltene Elemente) und
- die Differenzmenge 2 (nur in Menge 2 enthaltene Elemente) ermittelt.- mehrfach vorkommende Elemente werden nur 1-mal ausgegeben
- mehrfach vorkommende Elemente der Differenzmengen werden wahlweise kpl. oder 1-mal ausgegeben
- der Vergleich ist Case-Sensitiv, also [9] <> '9'
- Rückgabe erfolgt in einem 2D-Array ([n][0]=Schnittmenge; [n][1]=Diff1; [n][2]=Diff2)
EDIT: Differenzmengen wahlweise komplett oder einmalig zurückgeben
EDIT 14.10.2008
- für $Delim wird als Standard 'Default' verwendet und damit das Trennzeichen aus Opt("GUIDataSeparatorChar")
- gefixed: Fehler bei Verwendung von @CRLF alsTrennzeichen
_GetIntersection( )
#include <array.au3>
Local $1 = '1,1,2,3,3,3,4,4,5,6,7'
Local $2[10] = ['5','5','5','8','8','9','12','12','3','1']
Local $ret = _GetIntersection($1, $2, 0, ',')
If IsArray($ret) Then _ArrayDisplay($ret)
Local $ret = _GetIntersection($1, $2, 1, ',')
If IsArray($ret) Then _ArrayDisplay($ret)
;==================================================================================================
; 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 ([email='bugfix@autoit.de'][/email])
;==================================================================================================
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