Sortieren von MAPs ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Sortieren von MAPs ?

Beitrag von Bisonte »

Hallo.

Ich habe da mit Newmap eine Liste von Usern, die ich per PHP aus einer DB raushole und dann mit PB einlese.

Nach dem einlesen in eine MAP hab ich aber das Problem, dass die Namen nicht mehr von A-Z sortiert sind,
wenn ich mit Foreach ... Next die Map durchgehe... wobei sie im .txt File natürlich alphabetisch aufgelistet sind.

Die Sort - Lib in PB scheint nur Arrays und Listen zu unterstützen.

Wie kann ich also die Map in alphabetische Reihenfolge bekommen (Foreach... Next) ?
Weil so durcheinander in einem ListIcon ist für den Endnutzer ziemlich Murks...

Dabei sei noch gesagt, das der Name des Users zugleich auch der MapKey ist.

Hat irgendjemand einen Vorschlag, wie man das Problem angehen kann ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sortieren von MAPs ?

Beitrag von STARGÅTE »

An deiner Stelle würde ich eine LinkedList nehmen, welche die Namen als Strukturfeld enthält,
welche du dann mit SortStructuredList sortieren kannst.
Die Map an sich kann man in PB nicht sortieren, dort würde ich einfach nur n Pointer-Map erstellen, welche zu jedem Namen (Key) den Pointer zum LinkedListElement hat.

Somit hast du schnellen Zugriff über die namen über die Map. und gleichzeitig eine richtige Sortierung in der Liste.

EDIT: Beispiel:

Code: Alles auswählen

Structure User
  Name$
  Value$
EndStructure

Global NewList User.User()
Global NewMap *User.User()

Procedure NewElement(Name$, Value$)
  AddMapElement(*User(), Name$)
  *User() = AddElement(User())
  User()\Name$  = Name$
  User()\Value$ = Value$
EndProcedure

NewElement("Alpha", "1")
NewElement("Gamma", "2")
NewElement("Beta", "3")
NewElement("Delta", "4")

SortStructuredList(User(), #PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(User\Name$), #PB_Sort_String)

Debug "LinkedList (sortiert):"
ForEach User()
  Debug "  "+User()\Name$+" = "+User()\Value$
Next

Debug "Map (unsortiert):"
ForEach *User()
  Debug "  "+*User()\Name$+" = "+*User()\Value$
Next

Debug "Direktzugriff (über Name-Key):"
Debug "  Beta = "+*User("Beta")\Value$
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Sortieren von MAPs ?

Beitrag von DarkDragon »

Wie auch schon im englischen Forum erwähnt und lang und breit diskutiert:

Bitte lest doch erstmal Bücher über Hashing bevor ihr solche Fragen stellt. ForEach über eine Map garantiert niemals eine sortierte Ausgabe der Elemente. D.h. selbst wenn du die Elemente irgendwie Swappen würdest, so könnte ForEach sich anders entscheiden und beim nächsten durchlauf eine komplett andere Reihenfolge wählen wie es durch die Elemente durchtraversiert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Sortieren von MAPs ?

Beitrag von Bisonte »

Danke erstmal.

Aber ich habe extra MAP genommen, da bei grösseren Datenmengen das raussuchen aus einer LL entfällt (Zeitfaktor), da der Name "unique" ist.

Ok das mit der Linkedlist ist klar, also werde ich wohl nicht umhinkommen, nur die Namen in einer LL zu haben.
Ich benötige die auch bloss um sie in einem ListIcon sortiert darzustellen.

Ups. Das hab ich jetzt erst geschnallt , dass Du genau das sagst... >:) jaja das Alter... aua.

Naja mit Pointern und direkt aus dem Speicher auslesen, da hab ich immer das Vergnuegen das Tante Ima gelegentlich vorbeischaut.
Und ich dann meist kein Plan habe warum und wieso... :(

Edit: @Darkdragon: Tschuldigung, aber des englischen bin ich nicht so mächtig wie manch einer, und bevor ich mich nun durch einen wassweissichwiedicken Wälzer boxe wovon ich womöglich nur ein achtel verstehe, da ich kein Mathestudent war, der auch noch gekauft werden muss, um eine klitzekleine Info herauszufiltern... Vertraue ich als relativer Anfänger auf den gehobenen Wissensstand der Forenmitglieder. Die meist blitzartig den richtigen Weg aufzeigen. :allright:
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Sortieren von MAPs ?

Beitrag von STARGÅTE »

Naja mit Pointern und direkt aus dem Speicher auslesen, da hab ich immer das Vergnuegen das Tante Ima gelegentlich vorbeischaut.
Und ich dann meist kein Plan habe warum und wieso...
In meinem Beispiel mache ich aber keine "Umwege" mit direkten Speicherauslesen und Peek und Poke ^^

Das ich dort mache, ist nichts weiter als eine art Map aus Verknüpfungen anzulegen.
Jede Verknüpfung verweist genau auf ein Listenelement.

Egal in welcher Reihenfolge nun die Liste vorliegt, bleiben die Verknüpfungen immer erhalten.
Und wie unter Windows mit Verknüpfungen kann ich nun diese Map benutzen um direkt das Listenelement anzusprechen.

Aber wenn du es eh nur in ein Gadget knallen willst, dann reicht eine Liste aus, ohne Map ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten