Seite 2 von 2

Re: Duplikate in List() löschen

Verfasst: 25.01.2015 14:37
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.

Re: Duplikate in List() löschen

Verfasst: 25.01.2015 14:44
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)

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

Verfasst: 27.01.2015 14:58
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

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

Verfasst: 27.01.2015 19:14
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.

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

Verfasst: 27.01.2015 20:48
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

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

Verfasst: 27.01.2015 20:54
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?

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

Verfasst: 27.01.2015 21:03
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

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

Verfasst: 27.01.2015 21:17
von Tommy
Coole SQLite und Map Variante :allright:
":memory:" is auch sehr nützlich kannte ich noch nich, thx Peter :allright: