func hashJoin(table1, index1, table2, index2) { var a = [] var h = Hash() # hash phase table1.each { |s| h{s[index1]} := [] << s } # join phase table2.each { |r| a += h{r[index2]}.map{[_,r]} } return a } var t1 = [[27, "Jonah"], [18, "Alan"], [28, "Glory"], [18, "Popeye"], [28, "Alan"]] var t2 = [["Jonah", "Whales"], ["Jonah", "Spiders"], ["Alan", "Ghosts"], ["Alan", "Zombies"], ["Glory", "Buffy"]] hashJoin(t1, 1, t2, 0).each { .say }