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

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

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

Beitrag 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 ;)
Zuletzt geändert von Tommy am 27.01.2015 14:56, insgesamt 3-mal geändert.
PB 5.41 x64
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Duplikate in List() löschen

Beitrag 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.
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Duplikate in List() löschen

Beitrag von NicTheQuick »

In dem Falle böte sich auch noch eine Variante mit Maps an.
Bild
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Duplikate in List() löschen

Beitrag 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
Zuletzt geändert von Vera am 22.01.2015 13:21, insgesamt 1-mal geändert.
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Duplikate in List() löschen

Beitrag 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
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Duplikate in List() löschen

Beitrag von RSBasic »

Code: Alles auswählen

DeleteElement(lList(), 1)
Dann sollte sein Code nicht mehr abstürzen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Duplikate in List() löschen

Beitrag 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.
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Duplikate in List() löschen

Beitrag 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
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Duplikate in List() löschen

Beitrag 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.
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Duplikate in List() löschen

Beitrag 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.
Antworten