RosettaCodeData/Task/Hash-from-two-arrays/M2000-Interpreter/hash-from-two-arrays-2.m2000
2023-07-01 13:44:08 -04:00

41 lines
1.4 KiB
Text

Module Checkit {
Function MakeHash(&a$(), &b$()) {
if dimension(a$())<>1 or dimension(b$())<>1 then Error "Only for one dimension arrays"
if len(a$())<>len(b$()) Then Error "Only for same size arrays"
start=dimension(a$(),1, 0)
end=dimension(a$(),1, 1)
start2=dimension(b$(),1, 0)
Inventory Hash
For i=start to end {
if Exist(hash, a$(i)) Then {
\\ s is a pointer to a stack object
s=hash(a$(i))
Stack s {Data i-start+start2}
} Else Append hash, a$(i):=Stack:=i-start+start2
}
=Hash
}
Module PrintKeyItems (hash, akey$, &b$()) {
\\ n=hash(akey$) ' use this if akey$ allways is a proper key
\\ and hide these two lines using \\
if not exist(hash, akey$) then Error "Key not exist"
n=Eval(hash)
For i=1 to Len(n) {
Print b$(stackitem(n,i)),
}
Print
}
Dim a$(2 to 5)
Dim b$(4 to 7)
a$(2)="A", "B","A","C"
b$(4)="A1","B1","A2", "C1"
MyHash=MakeHash(&a$(), &b$())
PrintkeyItems Myhash, "A", &b$() ' print A1 A2
PrintkeyItems Myhash, "B", &b$() ' print B1
PrintkeyItems Myhash, "C", &b$() ' print C1
}
Checkit