Seite 3 von 3

Re: Durchlauf von Map mit ForEach

Verfasst: 20.01.2023 15:30
von techniker
@Benubi:
Das ist nicht mein Problem!
Die Keys sind einmalig. Die Werte können aber mehrmals vorhanden sein, was ich detektieren muss.
Als Rückgabe brauche ich die Keys, bei denen doppelte Werte erkannt wurden.

Re: Durchlauf von Map mit ForEach

Verfasst: 20.01.2023 16:45
von mk-soft
Da ist eine Datenbank schon der richtige weg.

Re: Durchlauf von Map mit ForEach

Verfasst: 20.01.2023 18:22
von jogo
jetzt mal abgesehen von der Datenbanklösung oder der prophylaktischen Prüfung von Doppelwerten.

Möglicherweise interpretiere ich ja falsch - aber ist das Beispiel in der Hilfe nicht genau das, was du suchst?
Dort wird doch nach vorhandenen Doppelwerten gesucht und gelöscht, oder?
https://www.purebasic.com/german/docume ... ition.html

Re: Durchlauf von Map mit ForEach

Verfasst: 20.01.2023 18:28
von TroaX
jogo hat geschrieben: 20.01.2023 18:22 jetzt mal abgesehen von der Datenbanklösung oder der prophylaktischen Prüfung von Doppelwerten.

Möglicherweise interpretiere ich ja falsch - aber ist das Beispiel in der Hilfe nicht genau das, was du suchst?
Dort wird doch nach vorhandenen Doppelwerten gesucht und gelöscht, oder?
https://www.purebasic.com/german/docume ... ition.html
So eine Lösung hatte er ja schon. Es geht da um die Dauer dieses Vorgehens, da er ja theoretisch jeden Wert mir jedem Wert vergleichen muss und das bei 70K Einträgen.

Re: Durchlauf von Map mit ForEach

Verfasst: 25.01.2023 13:12
von Demivec
techniker hat geschrieben: 20.01.2023 13:42
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.
Wie erkennst du sonst, welche Keys von Dubletten betroffen sind?
(Dubletten sollen nicht verboten sein, aber müssen detektiert werden)
Die Map hat momentan bis zu 70'000 Elemente.

obst("key1") = "Apfel"
obst("Key2") = "Birne"
obst("key3") = "Banane"
obst("key4") = "Birne"
obst("key5") = "Weintraube"
obst("key6") = "Banane"
obst("key7") = "Banane"

Bei diesem Beispiel brauche ich folgende Keys als Ergebnis:
key2, key3, key4, key6, key7
Ein anderer Weg mit Reverse Lookup:

Code: Alles auswählen

Structure kv_match
  List keys.s()
EndStructure


NewMap obst.s()

obst("key1") = "Apfel"
obst("Key2") = "Birne"
obst("key3") = "Banane"
obst("key4") = "Birne"
obst("key5") = "Weintraube"
obst("key6") = "Banane"
obst("key7") = "Banane"

ForEach obst()
  Debug "obst(" + MapKey(obst()) + ") = " + obst()
Next

Debug "---"
NewMap wert.kv_match()

ForEach obst()
  If FindMapElement(wert(),obst()) = 0
    AddMapElement(wert(), obst())
  EndIf
  AddElement(wert()\keys()): wert()\keys() = MapKey(obst())
Next

Debug "---"
ForEach wert()
  ;SortList(wert()\keys(), #PB_Sort_Ascending)
  If ListSize(wert()\keys()) > 1
    Debug "Wert(" + MapKey(wert()) + ") = " + ListSize(wert()\keys())
    ForEach wert()\keys()
      Debug wert()\keys()
    Next
  EndIf
Next