Hallo,
vorab: ich benötige den Code zwar für AHK, aber der Algorithmus kann auch in jeder beliebigen anderen Sprache geschrieben werden, bloß sollte er keine nativen Funktionen der Sprache verwenden, die es in AHK nicht gibt.
Ich bin dabei, ein Script für AHK schreiben, bei dem Chatnachrichten behandelt werden, und ich lege Wert darauf, dass jede einzelne Nachricht beachtet wird. Also ich lasse einen Timer laufen (alle 100ms), der die letzten 10 Chatnachrichten ausliest. Beim ersten Aufruf des Timers wird ein Array namens "oldChatMessages" mit den ersten 10 ausgelesenen Zeilen befüllt. Bei jedem weiteren Aufruf wird vor dem Überschreiben des Arrays "oldChatMessages" geschaut, welche Nachrichten neu sind, anschließend werte ich sie aus.
Und da kann es ja vorkommen, dass mehrere Nachrichten doppelt sind. Also muss ich irgendwie an das "Ende" des vorherigen Arrays anschließen, um die Schnittmenge zu löschen.
Ich demonstriere das mal kurz anhand eines Bildes:
Ich habe schon verschiedene Varianten probiert, hat aber alles nicht funktioniert.
Mein aktueller Ansatz, der aber nicht so richtig funktioniert:
onlyInFirst(arr1, arr2) {
; Umkehrung von Array 1, um es rückwärts zu durchlaufen
length := arr1.Length()
index := length
newChatLines := []
Loop %length%
{
newChatLines.Push(arr1[index])
index--
}
; Umkehrung von Array 2, um es rückwärts zu durchlaufen
length := arr2.Length()
index := length
oldChatLines := []
Loop %length%
{
oldChatLines.Push(arr2[index])
index--
}
; Hilfs-Array, soll die neuen Chatzeilen enthalten
hilfArr := copyArray(newChatLines)
message := "Message:"
; Gehe das Array mit den "alten" Chatzeilen durch
for i2, e2 in oldChatLines {
message .= "`nAlte Chatzeilen, Index " i2 ": " e2
; Gehe das Array mit den "neuen" Chatzeilen durch
for i1, e1 in newChatLines {
message .= "`nNeue Chatzeilen, Index " i1 ": " e1
; Überprüfe, ob die aktuell durchlaufene Zeile vom neuen Array
; mit der vom alten Array übereinstimmt
if (newChatLines[i1] == oldChatLines[i2]) {
; Überprüfe, ob das folgende Element vom neuen Array
; mit dem vom alten Array übereinstimmt
if (newChatLines[i1 + 1] == oldChatLines[i2 + 1]) {
; Lösche es aus dem Hilfs-Array
hilfArr.RemoveAt(i1 + 1)
}
}
}
}
MsgBox, %message%
return hilfArr
}
Alles anzeigen
Wäre nice, wenn mir jemand helfen könnte
Grüße