Frage zur Daten

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Frage zur Daten

Beitrag von marcelx »

ich möchte alle Daten zu "A" bekommen und in der Form als Paaren:
"1" - "Eins"
"2" - "Zwei"
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Frage zur Daten

Beitrag von mk-soft »

Bitte bedenk das es sich hier nicht um Daten die in einer Map liegen,
sondern eine rekursive Map handelt, wo die Map-Keys als Daten (nur String) betrachtet werden.

Es ist nicht die typische Verwendung von Maps.

Code: Alles auswählen

; zur "A" gehört "1", "2" und zur "1" gehört "Eins", zur "2" gehört "Zwei"
; zur "B" gehört "4" und zu "4" gehört "OK"
; zur "C" gehört "4", "2", "51" und zu "4" gehört "lala" zu "2" gehört "mama" und zu "51" gehört "papa"
; 
; Ich will wissen z.B. was gehört zur "C" und "2" ( => "mama")

Structure DatenMap
  Map daten.datenmap()
EndStructure
NewMap mapdaten.datenmap()
AddMapElement(mapdaten(),"A")
AddMapElement(mapdaten()\daten(),"1")
AddMapElement(mapdaten()\daten()\daten(),"Eins")

AddMapElement(mapdaten()\daten(),"2")
AddMapElement(mapdaten()\daten()\daten(),"Zwei")

AddMapElement(mapdaten(),"B")
AddMapElement(mapdaten()\daten(),"4")
AddMapElement(mapdaten()\daten()\daten(),"OK")

;suche nach a 2
If FindMapElement(mapdaten(),"A")
  ForEach mapdaten()\daten()
    Debug MapKey(mapdaten()\daten()) + " - " + MapKey(mapdaten()\daten()\daten())
  Next
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Frage zur Daten

Beitrag von marcelx »

Danke mk-soft
genau so wollte ich es haben
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Frage zur Daten

Beitrag von mk-soft »

Alternative mit echten Daten ...

Code: Alles auswählen

;-TOP

Structure udtDaten
  Text.s
  ; More data
  ; index.i
EndStructure

Structure udtMapDaten
  Map daten.udtDaten()
EndStructure

NewMap mapdaten.udtMapDaten()

AddMapElement(mapdaten(),"A")
AddMapElement(mapdaten()\daten(),"1")
mapdaten()\daten()\Text = "Eins"

AddMapElement(mapdaten()\daten(),"2")
mapdaten()\daten()\Text = "Zwei"

AddMapElement(mapdaten(),"B")
AddMapElement(mapdaten()\daten(),"4")
mapdaten()\daten()\Text = "OK"

If FindMapElement(mapdaten(),"A")
  ForEach mapdaten()\daten()
    Debug MapKey(mapdaten()\daten()) + " - " + mapdaten()\daten()\Text
  Next
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Frage zur Daten

Beitrag von marcelx »

Danke an alle,

die Lösung von mk-soft gefällt mir, so habe ich es übernohmen.

Gruß
MarcelX
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Frage zur Daten

Beitrag von helpy »

Und zur Übung ;-) für mich ein weiterer Versuch mit einem Modul und mit Listen statt Maps:

Code: Alles auswählen

EnableExplicit

DeclareModule DataTree
	Structure tTreeNode
		Name.s
		List Relations.tTreeNode()
	EndStructure
	
	Declare.i NewTree(NameOfDataTree.s)
	Declare.i FreeTree(*Tree.tTreeNode)
	Declare.i AddRelation(*Tree.tTreeNode, Level1.s, Level2.s=#Empty$, Level3.s=#Empty$)
	Declare.i GetNodeByName(*Tree.tTreeNode, Name.s)
EndDeclareModule

Module DataTree
	Procedure.i NewTree(NameOfDataTree.s)
		Protected *Tree.tTreeNode = AllocateStructure(tTreeNode)		
		*Tree\Name = NameOfDataTree
		ProcedureReturn *Tree
	EndProcedure
	
	Procedure.i FreeTree(*Tree.tTreeNode)
		FreeStructure(*Tree.tTreeNode)
	EndProcedure
	
	Procedure.i _AddRelation(*TreeNode.tTreeNode, Name.s)
		With *TreeNode
			ForEach \Relations()
				If \Relations()\Name = Name
					ProcedureReturn \Relations()
				EndIf
			Next
			AddElement(\Relations())
			\Relations()\Name = Name
			ProcedureReturn \Relations()
		EndWith
	EndProcedure
	
	Procedure.i AddRelation(*TreeNode.tTreeNode, Name1.s, Name2.s=#Empty$, Name3.s=#Empty$)
		Protected *NewTreeNode.tTreeNode
		If Name1 = #Empty$ : ProcedureReturn *NewTreeNode : EndIf
		*NewTreeNode = _AddRelation(*TreeNode, Name1)
		
		If Name2 = #Empty$ : ProcedureReturn *NewTreeNode : EndIf
		*NewTreeNode = _AddRelation(*NewTreeNode, Name2)
		
		If Name3 = #Empty$ : ProcedureReturn *NewTreeNode : EndIf
		*NewTreeNode = _AddRelation(*NewTreeNode, Name3)
		
		ProcedureReturn *NewTreeNode
	EndProcedure
	
	Procedure.i GetNodeByName(*TreeNode.tTreeNode, Name.s)
		Protected *TreeNodeOfName.tTreeNode
		With *TreeNode
			ForEach \Relations()
				If \Relations()\Name = Name
					*TreeNodeOfName = \Relations()
					Break
				EndIf
			Next
		EndWith
		ProcedureReturn *TreeNodeOfName
	EndProcedure
EndModule

CompilerIf #PB_Compiler_IsMainFile
	; zur "A" gehört "1", "2" und zur "1" gehört "Eins", zur "2" gehört "Zwei"
	; zur "B" gehört "4" und zu "4" gehört "OK"
	; zur "C" gehört "4", "2", "51" und zu "4" gehört "lala" zu "2" gehört "mama" und zu "51" gehört "papa"
	;
	; Ich will wissen z.B. was gehört zur "C" und "2" ( => "mama")
	
	Define *Tree1.DataTree::tTreeNode
	Define *Level1.DataTree::tTreeNode
	Define *Level2.DataTree::tTreeNode
	Define *Level3.DataTree::tTreeNode
	
	*Tree1 = DataTree::NewTree("MeineDaten TEST 1")

	DataTree::AddRelation(*Tree1, "A", "1", "Eins")
	DataTree::AddRelation(*Tree1, "A", "2", "Zwei")
	DataTree::AddRelation(*Tree1, "B", "4", "OK")
	DataTree::AddRelation(*Tree1, "C", "4", "lala")
	DataTree::AddRelation(*Tree1, "C", "2", "mama")
	DataTree::AddRelation(*Tree1, "C", "51", "papa")
	
	Debug "==============================================="
	Debug "Name of data tree: " + *Tree1\Name
	Debug "List all tree items:"
	ForEach *Tree1\Relations()	
		ForEach *Tree1\Relations()
			*Level1 = *Tree1\Relations()
			Debug "+ " + *Level1\Name
			ForEach *Level1\Relations()
				*Level2 = *Level1\Relations()
				Debug "  +-> " + *Level2\Name
				ForEach *Level2\Relations()
					*Level3 = *Level2\Relations()
					Debug "      --> " + *Level3\Name
				Next
			Next
		Next
	Next
	DataTree::FreeTree(*Tree1)
	
	
	Define *Tree2.DataTree::tTreeNode
	*Tree2 = DataTree::NewTree("MeineDaten TEST 2")

	*Level1 = DataTree::AddRelation(*Tree2, "A")
	DataTree::AddRelation(*Level1, "1", "Eins")
	DataTree::AddRelation(*Level1, "2", "Zwei")
	
	DataTree::AddRelation(*Tree2, "B", "4", "OK")
	
	*Level1 = DataTree::AddRelation(*Tree2, "C")
	DataTree::AddRelation(*Level1, "4", "lala")
	DataTree::AddRelation(*Level1, "2", "mama")
	DataTree::AddRelation(*Level1, "51", "papa")
	
	*Level1 = DataTree::GetNodeByName(*Tree2, "B")
	DataTree::AddRelation(*Level1, "1001", "Aladin")
	DataTree::AddRelation(*Level1, "4711", "Duft")
	DataTree::AddRelation(*Level1, "2020", "Dieses Jahr")
	DataTree::AddRelation(*Level1, "4", "In Ordnung")
	
	Debug "==============================================="
	Debug "Name of data tree: " + *Tree2\Name
	Debug "List all tree items:"
	ForEach *Tree2\Relations()	
		ForEach *Tree2\Relations()
			*Level1 = *Tree2\Relations()
			Debug "+ " + *Level1\Name
			ForEach *Level1\Relations()
				*Level2 = *Level1\Relations()
				Debug "  +-> " + *Level2\Name
				ForEach *Level2\Relations()
					*Level3 = *Level2\Relations()
					Debug "      --> " + *Level3\Name
				Next
			Next
		Next
	Next
	DataTree::FreeTree(*Tree2)

CompilerEndIf
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Antworten