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
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 »

Nino hat geschrieben:in dem Beispiel-Code wird auch gar kein gemerktes aktuelles Element gelöscht.
Das verstehe ich jetzt wiederum nicht, da in dem Beispiel

Code: Alles auswählen

DeleteElement(Numbers())
verwendet wird.

Wie gesagt, muß ich mir diese, für mich neuen Funktionen erstmal genauer ansehen, um deren Zusammenspiel zu verstehen und wo / wie sie sinnvoll eingesetzt werden können.
°
<°)))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:Wie gesagt, muß ich mir diese, für mich neuen Funktionen erstmal genauer ansehen
Wir diskutieren dann besser weiter, nachdem du das gemacht hast. :-)
(nicht böse gemeint)
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

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

Beitrag von Tommy »

@bobobo
du hast recht. Die Reihenfolge geht dadurch flöten. Wenn man die
Reihenfolge bei behalten möchte dann:

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
PB 5.41 x64
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 (alle OS, Anfänger-Tip)

Beitrag von Vera »

Code: Alles auswählen

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"
debug:
Maria
Sarah
Falko
Thomas
Holger
Alf
Dennis
Wo ist da 'Reihenfolge beibehalten' ?
Tommy hat geschrieben: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.
Is eigentlich ganz einfach ;)
Scheint doch nicht so einfach zu sein! ... besonders auch 'puren Anfängern' etwas Solides an die Hand zu geben.
Der Code is nich besonderes
Immerhin, der Auftakt stimmt.
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag von Kiffi »

na, dann komme ich mal mit meiner berüchtigten Spatzenkanone ;-)

Code: Alles auswählen

EnableExplicit

NewList lList.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"

UseSQLiteDatabase()

Define DB = OpenDatabase(#PB_Any, ":memory:", "", "", #PB_Database_SQLite)

If DB
  
  If DatabaseUpdate(DB, "Create Table DummyTable (ID Integer, DummyField Text Unique)")
    
    ForEach lList()
      If DatabaseUpdate(DB, "Insert Into DummyTable (ID, DummyField) Values (" + ListIndex(lList()) + ", '" + lList() + "')") = 0
        Debug lList() + ": " + DatabaseError() ; ausgeben, was hier aufgrund von Unique NICHT eingefügt wird
      EndIf
    Next
    
    ClearList(lList())
    
    If DatabaseQuery(DB, "Select DummyField From DummyTable Order By ID")
      
      While NextDatabaseRow(DB)
        AddElement(lList()) : lList() = GetDatabaseString(DB, 0)
      Wend
      
      FinishDatabaseQuery(DB)
      
    EndIf
    
  EndIf
  
  CloseDatabase(DB)
  
EndIf

Debug "---"
ForEach lList()
  Debug lList()
Next
Zum Hintergrund: Es wird eine SQLite-Datenbank im Speicher (':memory:') angelegt, die eine Tabelle beinhaltet, welche wiederum ein Unique-Feld enthält. Dieses verhindert, dass doppelte Einträge getätigt werden.

Im Grunde genommen ist es also eine überdimensionierte Map-Funktionalität. Maps haben allerdings die Eigenart, dass die Reihenfolge der darin enthaltenen Elemente nicht beeinflusst werden kann. Sprich: Die Einträge können nicht unbedingt in der Reihenfolge ausgelesen werden, in der man sie eingefügt hat. Leider gibt es auch keine Sort(Structured)Map(), wie man es von LinkedLists oder Arrays her kennt.

Die Einträge der SQLite-Tabelle können hingegen beliebig sortiert werden. Hier: nach der ID; also die Reihenfolge, in der die Einträge eingefügt wurden.

Grüße ... Peter
Hygge
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

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

Beitrag von bobobo »

Kiffi hat geschrieben:..Leider gibt es auch keine Sort(Structured)Map(), wie man es von LinkedLists oder Arrays her kennt.
..
wär's dann noch map?
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag von Kiffi »

bobobo hat geschrieben:wär's dann noch map?
man könnte es dann Map+ nennen. Oder PowerMap (obwohl mir PowerNap lieber wäre) ;-)

Hier noch mal ne Lösung mit einer Map:

Code: Alles auswählen

EnableExplicit

NewList lList.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"

NewMap myMap.s()

ForEach lList()
	If FindMapElement(myMap(), lList())
		DeleteElement(lList(), 1)
	Else
		myMap(lList()) = lList()
	EndIf
Next

ClearMap(myMap())

ForEach lList()
	Debug lList()
Next
Grüße ... Peter
Hygge
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

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

Beitrag von Tommy »

Coole SQLite und Map Variante :allright:
":memory:" is auch sehr nützlich kannte ich noch nich, thx Peter :allright:
PB 5.41 x64
Antworten