Verfasst: 15.08.2009 10:49
Ich freue mich sehr über die neue Map-Library, da ich sowas öfter gut gebrauchen kann. Dafür nochmal vielen Dank!
In einigen meiner Programme liegt eine Situation ähnlich wie z.B. am Empfangsschalter eines Kongressbüros vor: Jeder ankommende Besucher soll ein eindeutiges Namensschild bekommen, auch wenn manche Namen mehrfach vorkommen.
Ich benutze dafür im Moment eine selbst geschriebene Hash-Funktion, fände es aber schöner (und es wäre im Prinzip wohl auch schneller) zu diesem Zweck die Map-Library von PB 4.40+ zu verwenden. Folgender Code demonstriert was ich meine:
Der Code funktioniert genau wie erwartet, ich mache mir nur Gedanken über die Dauer. Meine Programme verarbeiten zig-tausende von Namen, und da spielt die Geschwindigkeit eine wichtige Rolle. Das ist ja einer der Gründe weshalb man Hash-Tables benutzt, weil die für solche Zwecke im Prinzip schnell sind.
Meine Sorge ist, dass in obigem Code der Hash-Table nameCount() 2x nach jedem Element durchsucht wird: einmal an der Stelle *1, und einmal an der Stelle *2. Stimmt das? Wenn nicht, bitte den folgenden Text ignorieren.
Oder kann man das Ergebnis von FindMapElement() (ein Pointer?) irgendwie weiterverwenden? Ich stelle mir sowas vor wie:
Dann wäre bis auf weiteres das gefundene Element auch das aktuelle, und der/die/das Map müsste nicht wieder neu durchsucht werden. Aber wie gesagt, vielleicht liege ich ja mit meinen Annahmen falsch ... Freak?
Und ist nach AddMapElement() das neu hinzugefügte Element automatisch das aktuelle?
Gruß, Little John
In einigen meiner Programme liegt eine Situation ähnlich wie z.B. am Empfangsschalter eines Kongressbüros vor: Jeder ankommende Besucher soll ein eindeutiges Namensschild bekommen, auch wenn manche Namen mehrfach vorkommen.
Ich benutze dafür im Moment eine selbst geschriebene Hash-Funktion, fände es aber schöner (und es wäre im Prinzip wohl auch schneller) zu diesem Zweck die Map-Library von PB 4.40+ zu verwenden. Folgender Code demonstriert was ich meine:
Code: Alles auswählen
; PB 4.40 Beta 1
EnableExplicit
Define k, p
Define name$
;-- Testdaten (könnten auch z.B. in einer Datei stehen)
Dim people$(10)
people$(0) = "Fred"
people$(1) = "Timo"
people$(2) = "Sara"
people$(3) = "Paul"
people$(4) = "Sara"
people$(5) = "Mary"
people$(6) = "Anna"
people$(7) = "Timo"
people$(8) = "Sara"
people$(9) = "Fred"
;-- Liste der unterschiedlichen Namen aufbauen und Personen mit gleichen Namen durchnummerieren
NewMap nameCount()
For k = 0 To 9
name$ = people$(k)
p = FindMapElement(nameCount(), name$) ;*1
If p = 0
AddMapElement(nameCount(), name$)
EndIf
nameCount(name$) + 1 ;*2
Debug name$ + " #" + Str(nameCount())
Next
Meine Sorge ist, dass in obigem Code der Hash-Table nameCount() 2x nach jedem Element durchsucht wird: einmal an der Stelle *1, und einmal an der Stelle *2. Stimmt das? Wenn nicht, bitte den folgenden Text ignorieren.

Oder kann man das Ergebnis von FindMapElement() (ein Pointer?) irgendwie weiterverwenden? Ich stelle mir sowas vor wie:
Code: Alles auswählen
p = FindMapElement(...)
If p <> 0
SetCurrentMapElement(p)
EndIf
Und ist nach AddMapElement() das neu hinzugefügte Element automatisch das aktuelle?
Gruß, Little John