Seite 1 von 1
Sortieren von MAPs ?
Verfasst: 09.09.2010 13:35
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 ?
Re: Sortieren von MAPs ?
Verfasst: 09.09.2010 13:41
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$
Re: Sortieren von MAPs ?
Verfasst: 09.09.2010 13:54
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.
Re: Sortieren von MAPs ?
Verfasst: 09.09.2010 14:01
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.

Re: Sortieren von MAPs ?
Verfasst: 09.09.2010 14:23
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 ...