Erstmal klingt das Thema abschreckend und man fragt sich: wozu brauche ich sowas?
Auf den zweiten Blick tauchen hier im Forum jedoch öfter Fragestellungen auf die sich mit Mengenoperationen effektiv lösen lassen.
So sind Fragestellungen wie z.B. "alle Elemente welche sowohl in Array1 als auch in Array2 vorkommen" beispielhaft für derartige Problemstellungen.
Diese UDF bietet daher einen Set-Datentyp und bringt die dazugehörigen mathematischen Funktionen mit (Vereinigung, Verschneidung, Differenz, symmetrische Differenz).
Um bisschen aus der Masse hervorzustechen bietet die UDF noch eine Funktion welche komplexe Mengenalgebra-Ausdrücke wie z.B. A∪B-(B∩(A∪A)∪C) direkt auflösen kann.
Wenn man sich bisschen von der mathematischen Theorie löst und auf die Praxis schielt wird sich für viele sicherlich eine sinnvolle Anwendung hierfür finden.
Wie funktionierts? - hier ein großes Beispiel:
#include "Set.au3"
; Beispiel-Arrays
Local $a_Test_1[] = [1, 2, 3, 4, 5]
Local $a_Test_2[] = [4, 5, 6, 7, 8, 9]
Local $a_Test_3[] = [4, 5, 6, 7, 8]
; Erzeuge die Sets aus den Arrays
$o_Set_1 = _set_Create($a_Test_1)
$o_Set_2 = _set_Create($a_Test_2)
$o_Set_3 = _set_Create($a_Test_3)
; Füge ein oder mehrere Elemente einer Set hinzu:
_set_Add($o_Set_1, 6)
Local $a_Temp[] = [10, 11, 12]
_set_Add($o_Set_1, $a_Temp)
; Lösche ein oder mehrere Elemente einer Set:
_set_Delete($o_Set_1, 6)
_set_Delete($o_Set_1, $a_Temp)
; Ermittele die Vereinigung A∪B zweier Mengen:
Local $o_Union = _set_Union($o_Set_1, $o_Set_2)
_set_Display($o_Union, "Vereinigung A∪B")
; Ermittele die Verschneidung A∩B zweier Mengen:
Local $o_Intersection = _set_Intersect($o_Set_1, $o_Set_2)
_set_Display($o_Intersection, "Verschneidung A∩B")
; Ermittele die Differenz A-B (bzw. A\B ) zweier Mengen:
Local $o_difference = _set_Difference($o_Set_1, $o_Set_2)
_set_Display($o_difference, "Differenz A-B")
; Ermittele die symmetrische Differenz A△B zweier Mengen:
Local $o_SymDifference = _set_SymDifference($o_Set_1, $o_Set_2)
_set_Display($o_SymDifference, "symmetrische Differenz A△B")
; Berechne komplexe Mengenalgebraische Ausdrücke in Stringform:
$o_Result = _set_algebraic("AuB-(Bn(AuA)uC)", $o_Set_1, $o_Set_2, $o_Set_3)
_set_Display($o_Result, "AuB-(Bn(AuA)uC)")
; Prüfe ob ein Wert Teil einer Menge ist:
If _set_Contain($o_Set_1, 4) Then MsgBox(0,"", "Wert '4' ist Teil der Menge $o_Set_1")
; Prüfe ob ein Menge eine Teilmenge einer anderen ist ( o_A ⊆ o_Set_1 ?)
Local $a_Vals[] = [2,3,4]
Local $o_A = _set_Create($a_Vals)
If _set_Contain($o_Set_1, $o_A) Then MsgBox(0,"", "$o_A ist eine Teilmenge von $o_Set_1" & @CRLF & "( o_A ⊆ o_Set_1 )")
; konvertierte eine Set in ein Array:
Local $a_Array = _set_ToArray($o_SymDifference)
_ArrayDisplay($a_Array, "konvertiertes Array")
Alles anzeigen