Wenn du tatsächlich nur Listen mit Zahlen oder eindeutig sortierbaren Werten hast, dann geht das ganze auch deutlich schneller, indem man beide Listen sortiert und dann nacheinander durch geht.
Code: Alles auswählen
EnableExplicit
Procedure diff(List list1.s(), List list2.s())
SortList(list1(), #PB_Sort_Ascending)
SortList(list2(), #PB_Sort_Ascending)
Protected NewList *onlyIn1.String()
Protected NewList *onlyIn2.String()
FirstElement(list1())
FirstElement(list2())
Protected next1.i, next2.i
Repeat
; Nur, damit man sieht, was gerade verglichen wird
Debug "Vergleiche '" + list1() + "' - '" + list2() + "'"
next1 = #True
next2 = #True
If (list1() = list2())
; Element ist in beiden Listen, also tue nichts
ElseIf (list1() < list2())
; Element in Liste 1 ist nicht in Liste 2
If AddElement(*onlyIn1())
*onlyIn1() = @list1()
EndIf
next2 = #False
Else
; Element in Liste 2 ist nicht in Liste 1
If AddElement(*onlyIn2())
*onlyIn2() = @list2()
EndIf
next1 = #False
EndIf
If (next1)
If (Not NextElement(list1()))
; Wenn es in Liste 1 nicht mehr weiter geht
While NextElement(list2())
If AddElement(*onlyIn2())
*onlyIn2() = @list2()
EndIf
Wend
Break
EndIf
EndIf
If (next2)
If (Not NextElement(list2()))
; Wenn es in Liste 2 nicht mehr weiter geht
While NextElement(list1())
If AddElement(*onlyIn1())
*onlyIn1() = @list1()
EndIf
Wend
Break
EndIf
EndIf
ForEver
Debug ""
Debug "Zeilen, die nur in Liste 1 vorhanden sind:"
ForEach *onlyIn1()
Debug "'" + *onlyIn1()\s + "'"
Next
Debug ""
Debug "Zeilen, die nur in Liste 2 vorhanden sind:"
ForEach *onlyIn2()
Debug "'" + *onlyIn2()\s + "'"
Next
Debug ""
EndProcedure
NewList liste1.s()
NewList liste2.s()
Define zeile.s
Restore Datei1
Repeat
Read.s zeile
If (AddElement(liste1()))
liste1() = zeile
EndIf
Until zeile = ""
Restore Datei2
Repeat
Read.s zeile
If (AddElement(liste2()))
liste2() = zeile
EndIf
Until zeile = ""
diff(liste1(), liste2())
DataSection
Datei1:
Data.s "Hallo", "das", "ist", "ein", "Test", "!", ""
Datei2:
Data.s "Aber", "Hallo", ",", "das", "Forum", "ist", "ja", "erste", "Sahne", "!", ""
EndDataSection
Achja, und wenn man Geschwindigkeiten messen will, macht man das natürlich ohne Debugger.