Module HashJoin { \\ normally we define variables when we put values to names \\ so we can remove these two lines Def Name$, Nemesis$ Def Long m, mc, items_size, A \\ Lets make a container which use keys with hash function Inventory A \\ A now is a pointer to an Inventory, with Len(A)=0 \\ Print Type$(A)="Inventory" \\ empty stack. We use current stack to place data Flush \Input B data "Jonah", "Whales" data "Jonah", "Spiders" data "Alan", "Ghosts" data "Alan", "Zombies" data "Glory", "Buffy" \\ Keys are unique, This is the HASH PHASE While not empty { Read Name$, Nemesis$ If Exist(A, Name$) Then { m=Eval(A) ' get a pointer to array Stack m {Data Nemesis$} } Else Append A, Name$:=Stack:=Nemesis$ ' a stack object with one item } \\ Input A, this is the Long Table data 27, "Jonah" data 18, "Alan" data 28, "Glory" data 18, "Popeye" data 28, "Alan" \\ This is the JOIN PHASE items_size=stack.size/2 \\ using items_size we can append data (using data) to stack \\ $(0) is the default handler for columns. \\ Letters justify to left, numbers to right. \\ Letters can use more columns, and maybe wrap to more lines. Print $(0), "Output during join" Print "A.Age", "A.Name","B.Character", "B.Nemesis" While items_size>0 { Read Age, Name$ If exist(A, Name$) Then { m=Eval(A) ' extract a pointer, this is for a stack object mc=Each(m) ' make an iterator While mc { \\ we use $(1) for left justify numbers too \\ normal StackItem$(stackobject) return top only \\ we have to use StackItem$(stackobject, 3) to get 3rd \\ or StackItem(stackobject, 3) if it is numeric. \\ but here mc is iterator, and place the cursor value to it Print $(1), Age, Name$,Name$, StackItem$(mc) \\ so now we place at the end of current stack the same output Data Age, Name$,Name$, StackItem$(mc) } } items_size-- } \\ split rem line after : to use second way rem : goto secondway Print $(0), "Output after join" Print "A.Age", "A.Name","B.Character", "B.Nemesis" While not Empty { Print $(1), Number, Letter$, Letter$, Letter$ } Exit secondway: Print $(0), "Output after join using format$()" Print Format$("{0:5} {1:10} {2:10} {3:20}","A.Age", "A.Name","B.Character", "B.Nemesis") While not Empty { Print format$("{0::5} {1:10} {2:10} {3:20}", Number, Letter$, Letter$, Letter$) } } HashJoin