Doppelte Einträge in einer LinkedList entfernen
Verfasst: 22.03.2007 20:56
Hallo!
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.
Verbesserte Versionen sind immer herzlich willkommen! Viel Spaß damit!
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