ZitatAus einem Excel ähnlichen Format erstelle ich mir ein 2D Array.
Nicht zufällig aus einer SQL Datenbank, hmn?
Nur eine Vermutung...
Wenn das der Fall ist, kannst du nämlich mit der richtigen SQL Abfrage die doppelten Daten nämlich vorab aussortieren. Das würde dein Problem komplett beseitigen und wir reden hier nicht um den heißen Brei herum...
Ansonsten erläutere doch erst mal von WO die Daten her kommen, um WELCHE Daten es sich handelt und WIE du diese einlest. Vielleicht lässt sich schon da was machen mit Strukturänderungen, um die Problemlösung zu vereinfachen. Denn was du da beschreibst von dem Problem her, könnte je nach Menge der Daten einiges an unnötiger Zeit kosten. Bevor ich dir also da mehrere Lösungswege gebe, wäre es gut wenn du mal ein paar Hintergrundinformationen liefern würdest. Du kannst es aber auch lassen, dann sag aber bescheid dass du nicht mehr Informationen preis geben willst. Dann werde ich eben auf dein geschildertes Beispiel einige Lösungsansätze vorschlagen.
Aber ich wette die passen dann zu 85% nicht zu deinem eigentlichen Problem. Erfahrungsgemäß...
++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Okey, ansonsten hier mal ein Lösungsansatz bezogen auf dein Beispiel:
Zuerst einmal brauchen wir eine Funktion welche 2 Datensätze miteinander vergleicht und überprüft, ob es sich um die selbe Beziehung (wie du sie geschildert hast) handelt:
Local $data[][] = _
[["abc", 1, 333, "def", 1], _ ; 0
["def", 1, 333, "abc", 1], _ ; 1
["def", 2, 444, "abc", 2], _ ; 2
["abc", 3, 555, "ghi", 1], _ ; 3
["jkl", 1, 333, "xyz", 3], _ ; 4
["ghi", 1, 555, "abc", 3]] ; 5
; 0 1 2 3 4
; Reihe 0 und Reihe 0 gleiche Beziehung?
ConsoleWrite(quickCheckRelation($data, 0, 0) & @CRLF)
; Reihe 0 und Reihe 1 gleiche Beziehung?
ConsoleWrite(quickCheckRelation($data, 0, 1) & @CRLF)
; Reihe 2 und Reihe 3 gleiche Beziehung?
ConsoleWrite(quickCheckRelation($data, 2, 3) & @CRLF)
; Reihe 3 und Reihe 5 gleiche Beziehung?
ConsoleWrite(quickCheckRelation($data, 3, 5) & @CRLF)
Func quickCheckRelation(ByRef $data, $rowA, $rowB)
Return _
($data[$rowA][0] = $data[$rowB][0] Or _ ; rA Haus A = rB Haus A
$data[$rowA][0] = $data[$rowB][3] Or _ ; rA Haus A = rB Haus B
$data[$rowA][3] = $data[$rowB][0] Or _ ; rA Haus B = rB Haus A
$data[$rowA][3] = $data[$rowB][3]) And _ ; rA Haus B = rB Haus B
($data[$rowA][1] = $data[$rowB][1] Or _ ; rA Haustür A = rB Haustür A
$data[$rowA][1] = $data[$rowB][4] Or _ ; rA Haustür A = rB Haustür B
$data[$rowA][4] = $data[$rowB][1] Or _ ; rA Haustür B = rB Haustür A
$data[$rowA][4] = $data[$rowB][4]) And _ ; rA Haustür B = rB Haustür B
$data[$rowA][2] = $data[$rowB][2] ; rA Straße A = rB Straße B
EndFunc
Alles anzeigen
Da wir nun eine Funktion haben welche die Dateneinträge vergleichen kann, können wir eigentlich das ganze Array einfach durchlaufen und die doppelten Einträge so ausfindig machen:
Local $data[][] = _
[["abc", 1, 333, "def", 1], _ ; 0
["def", 1, 333, "abc", 1], _ ; 1
["def", 2, 444, "abc", 2], _ ; 2
["abc", 3, 555, "ghi", 1], _ ; 3
["jkl", 1, 333, "xyz", 3], _ ; 4
["ghi", 1, 555, "abc", 3]] ; 5
; 0 1 2 3 4
For $a = 0 To UBound($data) -1
For $b = $a +1 To UBound($data) -1
If quickCheckRelation($data, $a, $b) Then
ConsoleWrite("Reihe " & $a & " | Reihe " & $b & @CRLF)
EndIf
Next
Next
Func quickCheckRelation(ByRef $data, $rowA, $rowB)
Return _
($data[$rowA][0] = $data[$rowB][0] Or _ ; rA Haus A = rB Haus A
$data[$rowA][0] = $data[$rowB][3] Or _ ; rA Haus A = rB Haus B
$data[$rowA][3] = $data[$rowB][0] Or _ ; rA Haus B = rB Haus A
$data[$rowA][3] = $data[$rowB][3]) And _ ; rA Haus B = rB Haus B
($data[$rowA][1] = $data[$rowB][1] Or _ ; rA Haustür A = rB Haustür A
$data[$rowA][1] = $data[$rowB][4] Or _ ; rA Haustür A = rB Haustür B
$data[$rowA][4] = $data[$rowB][1] Or _ ; rA Haustür B = rB Haustür A
$data[$rowA][4] = $data[$rowB][4]) And _ ; rA Haustür B = rB Haustür B
$data[$rowA][2] = $data[$rowB][2] ; rA Straße A = rB Straße B
EndFunc
Alles anzeigen
Und ab dieser Stelle aus musst du eigentlich nur noch dein Array kopieren und die gefundenen Einträge überspringen:
#include <Array.au3>
Local $data[][] = _
[["abc", 1, 333, "def", 1], _ ; 0
["def", 1, 333, "abc", 1], _ ; 1
["def", 2, 444, "abc", 2], _ ; 2
["abc", 3, 555, "ghi", 1], _ ; 3
["jkl", 1, 333, "xyz", 3], _ ; 4
["ghi", 1, 555, "abc", 3]] ; 5
; 0 1 2 3 4
Local $res[UBound($data, 1)][UBound($data, 2)]
Local $cnt = 0
For $a = 0 To UBound($data, 1) -1
Local $check = False
For $b = $a +1 To UBound($data, 1) -1
$check = $check Or quickCheckRelation($data, $a, $b)
Next
If Not $check Then
For $i = 0 To UBound($data, 2) -1
$res[$cnt][$i] = $data[$a][$i]
Next
$cnt += 1
EndIf
Next
ReDim $res[$cnt][UBound($res, 2)]
_ArrayDisplay($data)
_ArrayDisplay($res)
Func quickCheckRelation(ByRef $data, $rowA, $rowB)
Return _
($data[$rowA][0] = $data[$rowB][0] Or _ ; rA Haus A = rB Haus A
$data[$rowA][0] = $data[$rowB][3] Or _ ; rA Haus A = rB Haus B
$data[$rowA][3] = $data[$rowB][0] Or _ ; rA Haus B = rB Haus A
$data[$rowA][3] = $data[$rowB][3]) And _ ; rA Haus B = rB Haus B
($data[$rowA][1] = $data[$rowB][1] Or _ ; rA Haustür A = rB Haustür A
$data[$rowA][1] = $data[$rowB][4] Or _ ; rA Haustür A = rB Haustür B
$data[$rowA][4] = $data[$rowB][1] Or _ ; rA Haustür B = rB Haustür A
$data[$rowA][4] = $data[$rowB][4]) And _ ; rA Haustür B = rB Haustür B
$data[$rowA][2] = $data[$rowB][2] ; rA Straße A = rB Straße B
EndFunc
Alles anzeigen