eine kurze (und ggf. dumme) Frage:
Wenn ich eine Map mehrmals mit ForEach abarbeite, ist dann die Reihenfolge der Elemente immer gleich?
Danke!

Code: Alles auswählen
EnableExplicit
OpenConsole()
NewMap MultipleRunner.s()
Define.i Counter
MultipleRunner("Test_1") = "Test_1"
MultipleRunner("Test_2") = "Test_2"
MultipleRunner("Test_3") = "Test_3"
MultipleRunner("Test_4") = "Test_4"
MultipleRunner("Test_5") = "Test_5"
MultipleRunner("Test_6") = "Test_6"
MultipleRunner("Test_7") = "Test_7"
MultipleRunner("Test_8") = "Test_8"
MultipleRunner("Test_9") = "Test_9"
For Counter = 1 To 10
ForEach MultipleRunner()
PrintN(MapKey(MultipleRunner()) + " " + MultipleRunner())
If MultipleRunner() = "Test_6" And Mod(Counter, 2) = 0
Break
EndIf
Next
PrintN("")
Next
Input()
Code: Alles auswählen
Test_1 Test_1
Test_2 Test_2
Test_3 Test_3
Test_4 Test_4
Test_5 Test_5
Test_6 Test_6
Test_7 Test_7
Test_8 Test_8
Test_9 Test_9
Test_1 Test_1
Test_2 Test_2
Test_3 Test_3
Test_4 Test_4
Test_5 Test_5
Test_6 Test_6
Test_1 Test_1
Test_2 Test_2
Test_3 Test_3
Test_4 Test_4
Test_5 Test_5
Test_6 Test_6
Test_7 Test_7
Test_8 Test_8
Test_9 Test_9
Test_1 Test_1
Test_2 Test_2
Test_3 Test_3
Test_4 Test_4
Test_5 Test_5
Test_6 Test_6
Test_1 Test_1
Test_2 Test_2
Test_3 Test_3
Test_4 Test_4
Test_5 Test_5
Test_6 Test_6
Test_7 Test_7
Test_8 Test_8
Test_9 Test_9
Test_1 Test_1
Test_2 Test_2
Test_3 Test_3
Test_4 Test_4
Test_5 Test_5
Test_6 Test_6
Test_1 Test_1
Test_2 Test_2
Test_3 Test_3
Test_4 Test_4
Test_5 Test_5
Test_6 Test_6
Test_7 Test_7
Test_8 Test_8
Test_9 Test_9
Test_1 Test_1
Test_2 Test_2
Test_3 Test_3
Test_4 Test_4
Test_5 Test_5
Test_6 Test_6
Test_1 Test_1
Test_2 Test_2
Test_3 Test_3
Test_4 Test_4
Test_5 Test_5
Test_6 Test_6
Test_7 Test_7
Test_8 Test_8
Test_9 Test_9
Test_1 Test_1
Test_2 Test_2
Test_3 Test_3
Test_4 Test_4
Test_5 Test_5
Test_6 Test_6
Das ist keine zwingende Bedingung bei Maps. Bei einer Linked List sind die Elemente, wie es der Name schon sagt verknüpft und jedes Element kennt seinen Vorgänger und seinen Nachfolger. Map-Elemente sind nicht verknüpft.techniker hat geschrieben: 20.01.2023 08:46 Wenn ich eine Map mehrmals mit ForEach abarbeite, ist dann die Reihenfolge der Elemente immer gleich?
Nein das stimmt nicht. In deinem Beispiel sieht das so aus, weil die Keys eine gewisse Reihenfolge haben. Im allgemeinen, werden die Elemente aber nicht so durchlaufen, wie sie angelegt wurden.TroaX hat geschrieben: 20.01.2023 09:29 Schließlich sind die ja im Speicher auch in der Reihenfolge hinterlegt, wie die Elemente angelegt wurden
Code: Alles auswählen
Define NewMap Example.s()
Example("Some String") = "1"
Example("Another String") = "2"
Example("Any String") = "3"
Example("An additional String") = "4"
ForEach Example()
Debug "Example(" + MapKey(Example()) + ") = " + Example()
Next
Debug "---"
Example("A new String") = "5"
ForEach Example()
Debug "Example(" + MapKey(Example()) + ") = " + Example()
Next
Dafür gibt es ein Beispiel in der Hilfe:techniker hat geschrieben: 20.01.2023 09:47 Es gibt aber einen Punkt, bei dem ich die Einmaligkeit der Element-Werte prüfen muss..
Das ist dann eine verschachtelte ForEach() auf die gleiche Map.
Wenn die Reihenfolge immer gleich ist, könnte ich die untere ForEach() mit einem anderen
Offset starten und somit wird die Funktion schneller..
(Schwierig zu erklären..)
Hmm ich habe den PureBasic-Compiler für ziemlich primitiv gehalten. Das überrascht mich jetzt. Erklärt zwar nicht, warum das so ist. Aber wenn dem so ist, ziehe ich meine Aussage zurück. Für so etwas habe ich Maps sowieso nicht genutzt. Siehe mk-softSTARGÅTE hat geschrieben: 20.01.2023 10:08 Nein das stimmt nicht. In deinem Beispiel sieht das so aus, weil die Keys eine gewisse Reihenfolge haben. Im allgemeinen, werden die Elemente aber nicht so durchlaufen, wie sie angelegt wurden.
Man verwendet ja Maps um nicht durchsuchen zu müssen und ist somit schon sehr schnell.
Wie erkennst du sonst, welche Keys von Dubletten betroffen sind?mk-soft hat geschrieben: 20.01.2023 12:39 Man verwendet ja Maps um nicht durchsuchen zu müssen und ist somit schon sehr schnell.
Code: Alles auswählen
Structure udtMyData
Name.s
Value.i
EndStructure
Global NewList MyData.udtMyData()
Global NewMap *IndexMyData.udtMyData()
; Dummy Data
For i = 1 To 100
AddElement(MyData())
MyData()\Name = "Name_" + i
MyData()\Value = Random(1000)
Next
; Build Index
ForEach MyData()
*IndexMyData(MyData()\Name) = @MyData()
Next
If FindMapElement(*IndexMyData(), "Name_1")
Debug *IndexMyData()\Value
EndIf
If FindMapElement(*IndexMyData(), "Name_50")
Debug *IndexMyData()\Value
EndIf
Das ist mir schon klar - darum nutze ich ja auch Maps..mk-soft hat geschrieben: 20.01.2023 13:56 Map Keys müssen eindeutig sein. Sonst ist der schnelles zugriff nicht möglich.