Seite 1 von 2

Duplikate in List() löschen (alle OS, Anfänger-Tip)

Verfasst: 21.01.2015 11:27
von Tommy
Der Code is nich besonderes aber vielleicht eine gute Einstiegshilfe für pure Anfänger
die wissen wollen wie man doppelte Listitems löschen kann.

Code: Alles auswählen

Define LastlEntry$
NewList lList.s()
NewList tempList.s()

AddElement(lList()) : lList() = "Thomas"
AddElement(lList()) : lList() = "Maria"
AddElement(lList()) : lList() = "Dennis"
AddElement(lList()) : lList() = "Thomas"
AddElement(lList()) : lList() = "Alf"
AddElement(lList()) : lList() = "Sarah"
AddElement(lList()) : lList() = "Dennis"
AddElement(lList()) : lList() = "Falko"
AddElement(lList()) : lList() = "Thomas"
AddElement(lList()) : lList() = "Alf"
AddElement(lList()) : lList() = "Holger"
AddElement(lList()) : lList() = "Alf"
AddElement(lList()) : lList() = "Dennis"

CopyList(lList(), tempList())

SortList(tempList(), #PB_Sort_Ascending)
ForEach tempList()
  If tempList() = LastlEntry$
    ForEach lList()
      If tempList() = lList()
        DeleteElement(lList(), 1)
        Break 1
      EndIf
    Next
  EndIf
  LastlEntry$ = tempList()
Next

ForEach lList()
  Debug lList()
Next
Is eigentlich ganz einfach ;)

Re: Duplikate in List() löschen

Verfasst: 21.01.2015 18:15
von bobobo
So ist es nur nur dann einfach, wenn die Liste sortiert werden darf.
Ich könnte mir vorstellen, dass ab und zu die Reihenfolge von Bedeutung
sein könnte.

Re: Duplikate in List() löschen

Verfasst: 21.01.2015 19:04
von NicTheQuick
In dem Falle böte sich auch noch eine Variante mit Maps an.

Re: Duplikate in List() löschen

Verfasst: 22.01.2015 00:20
von Vera
Danke für die Anregungen.
Um die Reihenfolge zu bewahren, könnte man es mit Hilfe einer zweiten Liste dann so machen:

Code: Alles auswählen

; Mehrfach-Einträge einer Liste aussortieren 
; ErgebnisReihenfolge entspricht UrsprungsReihenfolge

EnableExplicit
NewList Names.s()

AddElement(Names()) : Names() = "Thomas"
AddElement(Names()) : Names() = "Maria"
AddElement(Names()) : Names() = "Dennis"
AddElement(Names()) : Names() = "Thomas"
AddElement(Names()) : Names() = "Alf"
AddElement(Names()) : Names() = "Sarah"
AddElement(Names()) : Names() = "" 
AddElement(Names()) : Names() = "Dennis"
AddElement(Names()) : Names() = "Falko"
AddElement(Names()) : Names() = "Thomas"
AddElement(Names()) : Names() = "Alf"
AddElement(Names()) : Names() = "Holger"
AddElement(Names()) : Names() = "Alf"
AddElement(Names()) : Names() = "Dennis"


NewList NewNames$()

ForEach Names()

  ForEach NewNames$()

    If NewNames$() = Names()
      DeleteElement(Names())
      Break
    EndIf
    
  Next
  
  AddElement(NewNames$())
  NewNames$() = Names()
Next

; Debug "...."
; ForEach NewNames$()
;   Debug NewNames$()
; Next
; Debug "...."

ForEach Names()
  Debug Names()
Next
greets ~ Vera

edit: code ergänzt

Re: Duplikate in List() löschen

Verfasst: 22.01.2015 07:58
von Nino
bobobo hat geschrieben:So ist es nur nur dann einfach, wenn die Liste sortiert werden darf.
Auch dafür ist es noch nicht ganz fertig, denn sowas soll ja allgemein funktionieren. Ich habe nur einen leeren Eintrag zur Liste hinzugefügt, und das Programm stürzt ab.

Code: Alles auswählen

Define NewList lList.s(), LastlEntry$

AddElement(lList()) : lList() = "Thomas"
AddElement(lList()) : lList() = "Maria"
AddElement(lList()) : lList() = "Dennis"
AddElement(lList()) : lList() = "Thomas"
AddElement(lList()) : lList() = "Alf"
AddElement(lList()) : lList() = "Sarah"
AddElement(lList()) : lList() = ""
AddElement(lList()) : lList() = "Dennis"
AddElement(lList()) : lList() = "Falko"
AddElement(lList()) : lList() = "Thomas"
AddElement(lList()) : lList() = "Alf"
AddElement(lList()) : lList() = "Holger"
AddElement(lList()) : lList() = "Alf"
AddElement(lList()) : lList() = "Dennis"

SortList(lList(), #PB_Sort_Ascending)

ForEach lList()
   If lList() = LastlEntry$
      DeleteElement(lList())
   EndIf
   LastlEntry$ = lList()
Next

ForEach lList()
   Debug lList()
Next

Re: Duplikate in List() löschen

Verfasst: 22.01.2015 10:09
von RSBasic

Code: Alles auswählen

DeleteElement(lList(), 1)
Dann sollte sein Code nicht mehr abstürzen.

Re: Duplikate in List() löschen

Verfasst: 22.01.2015 13:19
von Vera
Guter Tip Nino und dank für die schnelle Lösung RSBasic :-)

Hab's meinem Code ebenfalls beigefügt, auch wenn's dort diese Nebenwirkungen nicht hat.

Re: Duplikate in List() löschen

Verfasst: 25.01.2015 01:49
von Nino
Vera hat geschrieben:Um die Reihenfolge zu bewahren, könnte man es mit Hilfe einer zweiten Liste dann so machen:
Ja, das könnte man.
Aber wenn die Liste lang ist und größere Elemente als nur recht kurze Namen enthält, kann das Kopieren einige Zeit beanspruchen.
Das Gleiche geht (IMHO besser) auch ohne eine zweite Liste, und die fertige Lösung wird sogar schon in PBs Referenz-Handbuch mitgeliefert, :-)
siehe Beispiel-Code bei http://www.purebasic.com/german/documen ... ition.html

Re: Duplikate in List() löschen

Verfasst: 25.01.2015 13:45
von Vera
Danke für den Tip Nino
- PushListPosition() ist mir neu und jetzt auf meiner ToDo-Liste.

Allerdings steht dort auch:
Hinweis: Es ist nicht erlaubt, mit Hilfe der DeleteElement() oder ClearList() Funktionen ein gemerktes aktuelles Element zu löschen. ...
Man müßte dann vermutlich am Ende der gesamten Procedure den 'Stack' zu einer neuen LListe machen, anstatt die bestehende beim Ablauf schon zu bereinigen.

Re: Duplikate in List() löschen

Verfasst: 25.01.2015 14:19
von Nino
Vera hat geschrieben:Allerdings steht dort auch: [...]
Hallo Vera,

ich verstehe jetzt das Problem nicht.
Wie ich schon schrieb, steht dort in der Hilfe doch als Beispiel der fertige Code genau für das hier gegebene Problem.
Und in dem Beispiel-Code wird auch gar kein gemerktes aktuelles Element gelöscht.