Wollte der Community mal nen Code stiften, da dachte ich an einen, der doppelte Einträge aus einer LinkedList entfernt.
Es gibt drei verschiedene Prozeduren für Long.l, Quad.q und String.s; wenn ihr andere Typen braucht (.c, .w oder so, dann ändert die vorhanden Prozeduren einfach ab).
Sie sind schon so gut wie nicht mehr optimierbar, da der Algorithmus so arbeitet:
Es wird nicht jedes mit jedem Element verglichen, sondern nur jedes Element mit jedem nachfolgenden. Das macht die Sache so schnell.
Code: Alles auswählen
EnableExplicit
Procedure FilterListL(LiLi.l())
ForEach LiLi()
Protected *element=@LiLi(), element.l=LiLi()
While NextElement(LiLi())
If LiLi() = element
DeleteElement(LiLi())
EndIf
Wend
ChangeCurrentElement(LiLi(), *element)
Next
EndProcedure
Procedure FilterListQ(LiLi.q())
ForEach LiLi()
Protected *element=@LiLi(), element.q=LiLi()
While NextElement(LiLi())
If LiLi() = element
DeleteElement(LiLi())
EndIf
Wend
ChangeCurrentElement(LiLi(), *element)
Next
EndProcedure
Procedure FilterListS(LiLi.s())
ForEach LiLi()
Protected *element=@LiLi(), element.s=LiLi()
While NextElement(LiLi())
If LiLi() = element
DeleteElement(LiLi())
EndIf
Wend
ChangeCurrentElement(LiLi(), *element)
Next
EndProcedure
NewList myList.l()
Repeat ; Filling List with 999 random numbers from 1 - 6
AddElement(myList()) : myList()=Random(5)+1
Until CountList(myList()) = 999
FilterListL(myList())
; Debugging list. There should be all numbers from 1 - 6 but only once
ForEach myList()
Debug myList()
Next