Hash from two arrays: Difference between revisions

(Added NetRexx (derived from Rexx))
 
(174 intermediate revisions by 83 users not shown)
Line 1:
{{task|Basic language learning}}
{{task|Basic language learning}}Using two Arrays of equal length, create a Hash object where the elements from one array (the keys) are linked to the elements of the other (the values)
[[Category:Data Structures]]
{{omit from|BASIC}} <!-- Does not have hash tables or other map structures. -->
{{omit from|PowerBASIC}}
{{omit from|TI-83 BASIC}}
{{omit from|TI-89 BASIC}}
 
;Task:
Related task: [[Associative arrays/Creation]]
Using two Arrays of equal length, create a Hash object
where the elements from one array (the keys) are linked
to the elements of the other (the values)
 
 
;Related task:
* &nbsp; [[Associative arrays/Creation]]
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">V keys = [‘a’, ‘b’, ‘c’]
V values = [1, 2, 3]
V hash_ = Dict(zip(keys, values))
print(hash_)</syntaxhighlight>
 
=={{header|ActionScript}}==
<langsyntaxhighlight lang="actionscript">package
{
public class MyClass
Line 18 ⟶ 39:
}
}
}</langsyntaxhighlight>
 
=={{header|Ada}}==
{{works with|GNAT|GPL 2007}}
<langsyntaxhighlight lang="ada">with Ada.Strings.Hash;
with Ada.Containers.Hashed_Maps;
with Ada.Text_Io;
Line 64 ⟶ 85:
end loop;
end Hash_Map_Test;</langsyntaxhighlight>
 
=={{header|Amazing Hopper}}==
Example:
<syntaxhighlight lang="amazing hopper">
#!/usr/bin/hopper
#include <hopper.h>
 
main:
new hash(h)
add hash(h,"chile" :: 100)
add hash(h,"argentina"::200)
add hash(h,"brasil"::300)
{"\nLongitud HASH: "},len hash(h),println
println(hash(h))
println( get value("argentina",h) )
println( get value("chile",h) )
try
println( get value("guyana",h) )
catch(e)
{"***[",e,"]: "}get str error,println
finish
println( get key(300,h) )
println( get key(100,h) )
 
mod value("chile",101,h)
mod key(200,"madagascar",h)
try
mod key(130,"londres",h)
println( get key(130,h) )
catch(e)
{"***[",e,"]: "}get str error,println
finish
println( get key(200,h) )
println( get value("chile",h) )
println("HASH actual: \n")
println(hash(h))
{"\nLongitud HASH: "},len hash(h),println
 
put after value (200,"colombia",400,h)
put value (200,"mexico",401,h)
println(hash(h))
 
put after key ("chile","antartida",110,h)
put key ("chile","peru",99,h)
 
println("HASH actual: \n")
println(hash(h))
{"\nLongitud HASH: "},len hash(h),println
 
del by key("brasil",h)
del by value(101,h)
 
{"\nLongitud HASH: "},len hash(h),println
println(hash(h))
sort hash(h)
{"\nORDENADO: \n"}println
println(hash(h))
 
y={} // para un stack de arreglos.
x=0,{5,5}rand array(x)
{x}push(y)
add hash(h,"arreglo 1"::x)
{"Ojalá que llueva café en el campo"}strtoutf8,push(y)
clear(x),w=0,{6,2}rand array(w)
{w}push(y)
add hash(h,"arreglo 2"::w)
clear(w)
add hash(h,"objeto",y)
 
println(hash(h))
println("arreglo 2?\n")
get value("arreglo 2",h)
println
println("arreglo 1?\n")
get value("arreglo 1",h)
println
 
/* NO PUEDES ORDENAR UN HASH QUE CONTENGA ARRAYS
PORQUE SE BLOQUEARA EL PROGRAMA:
sort hash(h)
{"\nORDENADO: \n"}println
println(hash(h)) */
println("Objeto?\n")
get value("objeto",h)
z=0,mov(z)
/* Esto fallará, porque no se puede hacer un
push de pushs*/
pop(z),println
pop(z),println
pop(z),println
{"Esto significa que no puedes meter un stack dentro de un hash\nsolo arrays de cualquier dimension"}println
/* esto está bien, porque es un stack simple
aunque contenga arreglos como elementos. */
pop(y),println
{"Dato en la última posición del stack:"}strtoutf8,{"\n"},[1:end,1:end]get(y),println
{"Esto significa que, si vas a meter arreglos dentro de un stack\nsácalos con POP antes de usarlo"}strtoutf8,println
pop(y),println
pop(y),println
 
pause
exit(0)
</syntaxhighlight>
Output:
<pre>Longitud HASH: 3
chile 100
argentina 200
brasil 300
 
200
100
***[2000]: getvalue: key not found
brasil
chile
***[2003]: modkey: value not found
madagascar
101
HASH actual:
 
chile 101
madagascar 200
brasil 300
 
 
Longitud HASH: 3
chile 101
mexico 401
madagascar 200
colombia 400
brasil 300
 
HASH actual:
 
peru 99
chile 101
antartida 110
mexico 401
madagascar 200
colombia 400
brasil 300
 
 
Longitud HASH: 7
 
Longitud HASH: 5
peru 99
antartida 110
mexico 401
madagascar 200
colombia 400
 
 
ORDENADO:
 
antartida 110
colombia 400
madagascar 200
mexico 401
peru 99
 
antartida 110
colombia 400
madagascar 200
mexico 401
peru 99
arreglo 1
arreglo 2
objeto
 
arreglo 2?
 
0.333623 0.056282
0.043443 0.218781
0.535042 0.147832
0.0998848 0.852316
0.89247 0.806435
0.148637 0.215199
 
arreglo 1?
 
0.881104 0.317274 0.744638 0.70655 0.296321
0.322729 0.49368 0.00842611 0.302231 0.74979
0.541794 0.139073 0.503212 0.586376 0.81519
0.282293 0.47536 0.822661 0.861344 0.427054
0.671334 0.0660376 0.441688 0.742367 0.50555
 
Objeto?
 
 
 
0.744638 0.70655 0.296321
0.00842611 0.302231 0.74979
0.503212 0.586376 0.81519
0.822661 0.861344 0.427054
0.441688 0.742367 0.50555
 
Esto significa que no puedes meter un stack dentro de un hash
solo arrays de cualquier dimension
0.333623 0.056282
0.043443 0.218781
0.535042 0.147832
0.0998848 0.852316
0.89247 0.806435
0.148637 0.215199
 
Dato en la última posición del stack:
0.881104 0.322729 0.541794 0.282293 0.671334
0.317274 0.49368 0.139073 0.47536 0.0660376
0.744638 0.00842611 0.503212 0.822661 0.441688
0.70655 0.302231 0.586376 0.861344 0.742367
0.296321 0.74979 0.81519 0.427054 0.50555
Esto significa que, si vas a meter arreglos dentro de un stack
sácalos con POP antes de usarlo
Ojalá que llueva café en el campo
0.881104 0.317274 0.744638 0.70655 0.296321
0.322729 0.49368 0.00842611 0.302231 0.74979
0.541794 0.139073 0.503212 0.586376 0.81519
0.282293 0.47536 0.822661 0.861344 0.427054
0.671334 0.0660376 0.441688 0.742367 0.50555
</pre>
 
Macros used in the example, located in "hopper.h".
(Observation: some of these macros will be converted to libraries, due to their extension.)
 
<syntaxhighlight lang="amazing hopper">
/* macros HASH */
#defn createhash(_X_) _X__KEY={#VOID},_X__HASH={#VOID}
#synon createhash newhash
#defn addhash(_X_,_K_,_H_) {_H_}push(_X__HASH),{_K_}push(_X__KEY)
#defn getvalue(_X_,_Y_) _Y_03Rx0W91=0,{_X_,_Y__KEY},array(1),dup,zero?do{{"getvalue: key not found"}throw(2000)}\
mov(_Y_03Rx0W91),[_Y_03Rx0W91]get(_Y__HASH),clearmark,
#defn getkey(_X_,_Y_) _Y_03Rx0W91=0,{_X_,_Y__HASH},array(1),dup,zero?do{{"getkey: value not found"}throw(2001)}\
mov(_Y_03Rx0W91),[_Y_03Rx0W91]get(_Y__KEY),clearmark,
#defn modvalue(_K_,_H_,_X_) _Y_03Rx0W91=0,{_K_,_X__KEY},array(1),dup,zero?do{{"modvalue: key not found"}throw(2002)}\
mov(_Y_03Rx0W91),[_Y_03Rx0W91]{_H_}put(_X__HASH),clearmark,
#defn modkey(_H_,_K_,_X_) _Y_03Rx0W91=0,{_H_,_X__HASH},array(1),dup,zero?do{{"modkey: value not found"}throw(2003)}\
mov(_Y_03Rx0W91),[_Y_03Rx0W91]{_K_}put(_X__KEY),clearmark,
#defn putaftervalue(_H_,_K_,_V_,_X_) _X_03Rx0W91=0,{_H_,_X__HASH},array(1),dup,zero?do{{"putaftervalue: value not found"}throw(2006)}\
plus(1),mov(_X_03Rx0W91),{_K_}{_X_03Rx0W91,_X__KEY}array(3),\
{_V_}{_X_03Rx0W91,_X__HASH}array(3)
#defn putvalue(_H_,_K_,_V_,_X_) _X_03Rx0W91=0,{_H_,_X__HASH},array(1),dup,zero?do{{"putvalue: value not found"}throw(2006)}\
mov(_X_03Rx0W91),{_K_}{_X_03Rx0W91,_X__KEY}array(3),\
{_V_}{_X_03Rx0W91,_X__HASH}array(3),
#defn putafterkey(_H_,_K_,_V_,_X_) _X_03Rx0W91=0,{_H_,_X__KEY},array(1),dup,zero?do{{"putafterkey: key not found"}throw(2007)}\
plus(1),mov(_X_03Rx0W91),{_K_}{_X_03Rx0W91,_X__KEY}array(3),\
{_V_}{_X_03Rx0W91,_X__HASH}array(3),
 
#defn putkey(_H_,_K_,_V_,_X_) _X_03Rx0W91=0,{_H_,_X__KEY},array(1),dup,zero?do{{"putkey: value not found"}throw(2008)}\
mov(_X_03Rx0W91),{_K_}{_X_03Rx0W91,_X__KEY}array(3),\
{_V_}{_X_03Rx0W91,_X__HASH}array(3),
 
#defn delbyvalue(_H_,_X_) {_H_,_X__HASH},array(1),dup,zero?do{{"delbyvalue: value not found"}throw(2004)},\
{_X__KEY},keep,array(4),{_X__HASH},array(4),clearstack
 
#defn delbykey(_K_,_X_) {_K_,_X__KEY},array(1),dup,zero?do{{"delbykey: key not found"}throw(2005)},\
{_X__KEY},keep,array(4),{_X__HASH},array(4),clearstack
 
#defn sorthash(_X_) #RAND,_LEN_#RNDV=0,_DUP_H#RNDV=_X__HASH,_DUP_K#RNDV=_X__KEY,\
{_X__KEY}keep,length,mov(_LEN_#RNDV),array(0),\
_POS_#RNDV=0,_HASH_LOOP_#RNDV:,[_LEN_#RNDV]get(_X__KEY),{_DUP_K#RNDV}array(1),\
mov(_POS_#RNDV),[_POS_#RNDV]get(_DUP_H#RNDV),[_LEN_#RNDV]put(_X__HASH),\
--_LEN_#RNDV,{_LEN_#RNDV},jnz(_HASH_LOOP_#RNDV),clear(_DUP_H#RNDV),clear(_DUP_K#RNDV)
 
#defn lenhash(_X_) {_X__HASH}length,
#defn hash(_X_) #RAND,_TMP_#RNDV=0,{_X__HASH,_X__KEY}catcol(_TMP_#RNDV),{_TMP_#RNDV},clear(_TMP_#RNDV),
 
/* Other... */
/* TRY/CATCH */
#defn try swtrap( #CATCH ),
#defn raise(_ERR_,_M_) {_M_}, throw(_ERR_),
#defn catch(_X_) jmp(#ENDCATCH), %CATCH:, clearstack,_X_=0, gettry(_X_), // gettry hace poptry internamente?
#defn finish %ENDCATCH:, popcatch
 
/* print... */
#defn println(_X_) #ATOM #CMPLX,{"\n"} print
#define println {"\n"}print
 
</syntaxhighlight>
 
=={{header|Argile}}==
{{works with|Argile|1.1.0}}
<langsyntaxhighlight Argilelang="argile">use std, array, hash
 
let keys = @["hexadecimal" "decimal" "octal" "binary"]
Line 75 ⟶ 393:
for each val int i from 0 to 3
hash[keys[i]] = values[i]
del hash hash</langsyntaxhighlight>
 
=={{header|Arturo}}==
<syntaxhighlight lang="rebol">h: dictionary.raw flatten couple [a b c d] [1 2 3 4]
print h</syntaxhighlight>
{{out}}
 
<pre>[a:1 b:2 c:3 d:4]</pre>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">array1 := ["two", "three", "apple"]
array2 := [2, 3, "fruit"]
hash := {}
Loop % array1.maxIndex()
hash[array1[A_Index]] := array2[A_Index]
MsgBox % hash["apple"] "`n" hash["two"]</langsyntaxhighlight>
 
=={{header|AWK}}==
Awk arrays are used for both lists and hash maps.
<!-- http://ideone.com/MsdNUc -->
<lang awk>$ awk 'BEGIN{split("one two three",a);
<syntaxhighlight lang="awk"># usage: awk -v list1="i ii iii" -v list2="1 2 3" -f hash2.awk
split("1 2 3",b);
BEGIN {
for(i=1;i in a;i++){c[a[i]]=b[i]};
if(!list1) list1="one two three"
for(i in c)print i,c[i]
if(!list2) list2="1 2 3"
}'
split(list1, a);
split(list2, b);
for(i=1;i in a;i++) { c[a[i]] = b[i] };
for(i in c) print i,c[i]
}</syntaxhighlight>
 
{{out}}
<pre>
three 3
two 2
one 1</lang>
</pre>
 
=={{header|BASIC256}}==
''Solution is at [[Associative_array/Creation#BASIC256]]''.
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> DIM array1$(4) : array1$() = "0", "1", "2", "3", "4"
DIM array2$(4) : array2$() = "zero", "one", "two", "three", "four"
Line 116 ⟶ 457:
IF I% = 0 THEN = "" ELSE I% += LEN(key$) + 2
J% = INSTR(dict$, CHR$(0), I%)
= MID$(dict$, I%, J% - I%)</langsyntaxhighlight>
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat"> two three apple:?arr1
& 2 3 fruit:?arr2
& new$hash:?H
Line 129 ⟶ 470:
& (H..forall)$out
& ;
</syntaxhighlight>
</lang>
{{out}}
Output:
<pre>apple.fruit
three.3
Line 136 ⟶ 477:
 
=={{header|Brat}}==
<langsyntaxhighlight lang="brat">zip = { keys, values |
h = [:]
keys.each_with_index { key, index |
Line 145 ⟶ 486:
}
 
p zip [1 2 3] [:a :b :c] #Prints [1: a, 2: b, 3: c]</langsyntaxhighlight>
 
=={{header|C}}==
Line 152 ⟶ 493:
following implementation tries to be somewhat generic to facilitate using alternative key and
value types.
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Line 266 ⟶ 607:
}
return 0;
}</langsyntaxhighlight>
 
=={{header|C++ sharp}}==
===C# 1.0===
Technically a std::map is a binary search tree, not a hash table, but it provides the same functionality. The C++11 standard incorporates hash tables. To use a hash table in C++11, simply change ''std::map'' to ''std::unordered_map''. The core idea, turning two sequences into an associative mapping, is valid either way.
<syntaxhighlight lang="csharp">static class Program
{
static void Main()
{
System.Collections.Hashtable h = new System.Collections.Hashtable();
 
string[] keys = { "foo", "bar", "val" };
<lang cpp>#include <map>
string[] values = { "little", "miss", "muffet" };
#include <string>
 
System.Diagnostics.Trace.Assert(keys.Length == values.Length, "Arrays are not same length.");
int
main( int argc, char* argv[] )
{
std::string keys[] = { "1", "2", "3" } ;
std::string vals[] = { "a", "b", "c" } ;
std::map< std::string, std::string > hash ;
for( int i = 0 ; i < 3 ; i++ )
{
hash[ keys[i] ] = vals[i] ;
}
}</lang>
 
for (int i = 0; i < keys.Length; i++)
Alternatively:
{
<lang cpp>#include <map> // for std::map
h.Add(keys[i], values[i]);
#include <algorithm> // for std::transform
}
#include <string> // for std::string
}
#include <utility> // for std::make_pair
}</syntaxhighlight>
 
<code>Hashtable.Add</code> throws an exception when a key already exists.
int main()
 
An alternative method to add entries is to use the indexer setter, which replaces the old value associated with a key, if any:
<syntaxhighlight lang="csharp">h[keys[i]] = values[i];</syntaxhighlight>
 
===Modern===
Uses <code>System.Collections.Generic.Dictionary<TKey, TValue></code>, <code>Enumerable.ToDictionary</code> from LINQ, extension method syntax, and lambda expressions.
 
<code>Enumerable.Zip</code> truncates the longer of its arguments.
 
<syntaxhighlight lang="csharp">using System.Linq;
 
static class Program
{
static void Main()
std::string keys[] = { "one", "two", "three" };
{
std::string vals[] = { "foo", "bar", "baz" };
string[] keys = { "foo", "bar", "val" };
string[] values = { "little", "miss", "muffet" };
 
var h = keys
std::map<std::string, std::string> hash;
.Zip(values, (k, v) => (k, v))
.ToDictionary(keySelector: kv => kv.k, elementSelector: kv => kv.v);
}
}</syntaxhighlight>
 
=={{header|C++}}==
std::transform(keys, keys+3,
<syntaxhighlight lang="cpp">#include <unordered_map>
vals,
#include <string>
std::inserter(hash, hash.end()),
std::make_pair<std::string, std::string>);
}</lang>
 
int main()
=={{header|C sharp}}==
{
<lang csharp>System.Collections.HashTable h = new System.Collections.HashTable();
std::string keys[] = { "1", "2", "3" };
std::string vals[] = { "a", "b", "c" };
std::unordered_map<std::string, std::string> hash;
for( int i = 0 ; i < 3 ; i++ )
hash[ keys[i] ] = vals[i] ;
}</syntaxhighlight>
 
{{libheader|range-v3}}
string[] arg_keys = {"foo","bar","val"};
<syntaxhighlight lang="cpp">#include <range/v3/view/zip.hpp>
string[] arg_values = {"little", "miss", "muffet"};
#include <unordered_map>
#include <string>
//Some basic error checking
int arg_length = 0;
int main()
if ( arg_keys.Length == arg_values.Length ) {
{
arg_length = arg_keys.Length;
std::string keys[] = { "1", "2", "3" };
std::string vals[] = { "foo", "bar", "baz" };
std::unordered_map<std::string, std::string> hash(ranges::view::zip(keys, vals));
}
</syntaxhighlight>
 
=={{header|Ceylon}}==
for( int i = 0; i < arg_length; i++ ){
<syntaxhighlight lang="ceylon">shared void run() {
h.add( arg_keys[i], arg_values[i] );
value keys = [1, 2, 3];
}</lang>
value items = ['a', 'b', 'c'];
value hash = map(zipEntries(keys, items));
}</syntaxhighlight>
 
=={{header|Clojure}}==
Alternate way of adding values
<syntaxhighlight lang="lisp">(zipmap [\a \b \c] [1 2 3])</syntaxhighlight>
 
=={{header|Coco}}==
<lang csharp>for( int i = 0; i < arg_length; i++ ){
<syntaxhighlight lang="coco">keys = <[apple banana orange grape]>
h[ arg_keys[i] ] = arg_values[i];
values = <[red yellow orange purple]>
}</lang>
 
object = new
=={{header|Clojure}}==
@[keys[i]] = values[i] for i til keys.length</syntaxhighlight>
<lang lisp>(zipmap [\a \b \c] [1 2 3])</lang>
 
=={{header|CoffeeScript}}==
<langsyntaxhighlight lang="coffeescript">
keys = ['a','b','c']
values = [1,2,3]
map = {}
map[key] = values[i] for key, i in keys
</syntaxhighlight>
</lang>
 
=={{header|ColdFusion}}==
<langsyntaxhighlight ColdFusionlang="coldfusion"><cfscript>
function makeHash(keyArray, valueArray) {
var x = 1;
Line 354 ⟶ 721:
valueArray = [1, 2, 3];
map = makeHash(keyArray, valueArray);
</cfscript></langsyntaxhighlight>
 
=={{header|Common Lisp}}==
 
<langsyntaxhighlight lang="lisp">(defun rosetta-code-hash-from-two-arrays (vector-1 vector-2 &key (test 'eql))
(assert (= (length vector-1) (length vector-2)))
(let ((table (make-hash-table :test test :size (length vector-1))))
(map nil (lambda (k v) (setf (gethash k table) v))
vector-1 vector-2)
table))</langsyntaxhighlight>
 
Or, using cl:loop:
 
<langsyntaxhighlight lang="lisp">(defun rosetta-code-hash-from-two-arrays (vector-1 vector-2 &key (test 'eql))
(loop initially (assert (= (length vector-1) (length vector-2)))
with table = (make-hash-table :test test :size (length vector-1))
Line 373 ⟶ 740:
for v across vector-2
do (setf (gethash k table) v)
finally (return table)))</langsyntaxhighlight>
 
In Common Lisp terminology, a vector is a one-dimensional array.
 
=={{header|Crystal}}==
 
<syntaxhighlight lang="ruby">keys = ('a'..'z').to_a # => a, b, c ... z
vals = (1..26).to_a # => 1, 2, 3 ... 26
 
hash = Hash.zip(keys, vals)
p hash</syntaxhighlight>
 
<pre>
{'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6, 'g' => 7, 'h' => 8, 'i' => 9, 'j' => 10, 'k' => 11, 'l' => 12, 'm' => 13, 'n' => 14, 'o' => 15, 'p' => 16, 'q' => 17, 'r' => 18, 's' => 19, 't' => 20, 'u' => 21, 'v' => 22, 'w' => 23, 'x' => 24, 'y' => 25, 'z' => 26}
</pre>
 
=={{header|D}}==
<syntaxhighlight lang="d">void main() {
<lang d>import std.range: zip;
import std.array, std.range;
 
immutable hash = ["a", "b", "c"].zip([1, 2, 3]).assocArray;
void main() {
}</syntaxhighlight>
auto keys = ["one", "two", "three"];
auto values = [1, 2, 3];
 
=={{header|Déjà Vu}}==
int[string] hash;
<syntaxhighlight lang="dejavu">local :h_keys [ :one :two :three ]
local :h_values [ 1 2 3 ]
local :h {}
for item in h_keys:
set-to h item pop-from h_values
</syntaxhighlight>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{libheader| System.Generics.Collections}}
<syntaxhighlight lang="delphi">
program Hash_from_two_arrays;
 
{$APPTYPE CONSOLE}
foreach (idx, key; keys)
hash[key] = values[idx];
 
uses
// alternative using zip
System.SysUtils,
foreach (pair; zip(keys, values))
System.Generics.Collections;
hash[pair[0]] = pair[1];
 
}</lang>
type
THash = TDictionary<string, Integer>;
 
THashHelper = class helper for THash
procedure AddItems(keys: TArray<string>; values: TArray<Integer>);
end;
 
{ THashHelper }
 
procedure THashHelper.AddItems(keys: TArray<string>; values: TArray<Integer>);
var
i: Integer;
begin
Assert(length(keys) = Length(values), 'Keys and values, must have the same size.');
for i := 0 to High(keys) do
AddOrSetValue(keys[i], values[i]);
end;
 
var
hash: TDictionary<string, Integer>;
i: integer;
key: string;
 
begin
hash := TDictionary<string, Integer>.Create();
hash.AddItems(['a', 'b', 'c'], [1, 2, 3]);
 
for key in hash.Keys do
Writeln(key, ' ', hash[key]);
 
hash.Free;
 
readln;
end.
 
</syntaxhighlight>
{{out}}
<pre>
b 2
a 1
c 3
</pre>
=={{header|Diego}}==
Diego has in-built <code>hash</code> and <code>dict</code> (short for 'dictionary') objects which function the same, except <code>hash</code> can only accept uuid datatypes for keys. Diego also has <code>hash_</code> verb and <code>_hash</code> posit, used to hash an object/command.
<syntaxhighlight lang="diego">use_namespace(rosettacode)_me();
 
add_ary(keysDict)_values(a,b,c);
add_ary(valsDict)_values(1,2,3);
 
add_dict(aDict)_map([keysDict],[valsDict]);
 
add_hash(aHash)_hash[valsDict]; // Keys will be new uuids
 
reset_namespace[];</syntaxhighlight>
 
Arrays can manually be mapped from two arrays using a <code>_for</code> posit, for instance:
<syntaxhighlight lang="diego">use_namespace(rosettacode)_me();
 
add_dict(bDict);
add_dict(cDict);
add_for(i)_from(0)_lessthan()_[keysDict]_length()_inc()
with_dict(bDict)_mapkeys()_[keysDict]_at[i]_mapvals()_[valsDict]_at[i];
[cDict]_map()_[keysDict]_at[i]_[valsDict]_at[i]; // alternative shortened syntax
;
 
reset_namespace[];</syntaxhighlight>
 
=={{header|E}}==
 
<langsyntaxhighlight lang="e">def keys := ["one", "two", "three"]
def values := [1, 2, 3]
__makeMap.fromColumns(keys, values)</langsyntaxhighlight>
 
=={{header|EchoLisp}}==
<syntaxhighlight lang="scheme">
(lib 'hash)
 
(define H (make-hash))
(define keys '(elvis simon antoinette))
(define kvalues '("the king" "gallubert" "de gabolde d'Audan"))
 
(list->hash (map cons keys kvalues) H)
→ #hash:3
(hash-ref H 'elvis)
→ "the king"
</syntaxhighlight>
 
=={{header|Elixir}}==
<syntaxhighlight lang="elixir">iex(1)> keys = [:one, :two, :three]
[:one, :two, :three]
iex(2)> values = [1, 2, 3]
[1, 2, 3]
iex(3)> Enum.zip(keys, values) |> Enum.into(Map.new)
%{one: 1, three: 3, two: 2}</syntaxhighlight>
 
=={{header|Emacs Lisp}}==
<syntaxhighlight lang="lisp">
(let ((keys ["a" "b" "c"])
(values [1 2 3]))
(apply 'vector (cl-loop for i across keys for j across values collect (vector i j))))
</syntaxhighlight>
 
=={{header|EMal}}==
<syntaxhighlight lang="emal">
List keys = var["hal", 666, int[1,2,3]]
List vals = var["ibm", "devil", 123]
Map hash = keys.zip(vals)
writeLine(hash)
</syntaxhighlight>
{{out}}
<pre>
[hal:ibm,666:devil,[1,2,3]:123]
</pre>
 
=={{header|Erlang}}==
<syntaxhighlight lang="erlang">
Dictionary = dict:from_list( lists:zip([key1, key2, key3], [value1, 2, 3]) ).
</syntaxhighlight>
 
=={{header|F Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">HashMultiMap(Array.zip [|"foo"; "bar"; "baz"|] [|16384; 32768; 65536|], HashIdentity.Structural)</langsyntaxhighlight>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: hashtables ;
{ "one" "two" "three" } { 1 2 3 } zip >hashtable</langsyntaxhighlight>
 
=={{header|Falcon}}==
<langsyntaxhighlight lang="falcon">
keys = [ 'a', 'b', 'c', 'd' ]
values = [ 1, 2, 3, 4 ]
hash = [ => ]
for i in [ 0 : keys.len() ]: hash[ keys[ i ] ] = values[ i ]
</syntaxhighlight>
</lang>
 
=={{header|Fantom}}==
 
<langsyntaxhighlight lang="fantom">
class Main
{
Line 434 ⟶ 935:
}
}
</syntaxhighlight>
</lang>
 
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">Dim As String keys(1 To 5) = {"1", "2", "3", "4", "5"}
Dim As String values(1 To 5) = {"one", "two", "three", "four", "five"}
Dim As String hash(Lbound(keys) To Ubound(keys))
Dim As Integer i, temp
 
For i = Lbound(values) To Ubound(values)
temp = Val(keys(i))
hash(temp) = values(i)
Next i
 
For i = Lbound(hash) To Ubound(hash)
Print keys(i); " "; hash(i)'; " "; i
Next i
Sleep</syntaxhighlight>
{{out}}
<pre> 1 one
2 two
3 three
4 four
5 five</pre>
 
 
=={{header|Frink}}==
There is a built-in dictionary/hash constructor that takes two arrays as input.
<syntaxhighlight lang="frink">
a = new dict[["a", "b", "c"], [1, 2, 3]]
</syntaxhighlight>
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">
include "NSLog.incl"
 
void local fn DoIt
CFArrayRef keys = @[@"Key1",@"Key2",@"Key3",@"Key4"]
CFArrayRef values = @[@"One",@"Two",@"Three",@"O'Leary"]
CFDictionaryRef dict = fn DictionaryWithObjectsForKeys( values, keys )
NSLog(@"%@",dict)
end fn
 
fn DoIt
 
HandleEvents
</syntaxhighlight>
 
{{out}}
<pre>
{
Key1 = One;
Key2 = Two;
Key3 = Three;
Key4 = "O'Leary";
}
</pre>
 
=={{header|Gambas}}==
'''[https://gambas-playground.proko.eu/?gist=944f0b9cbf60910e7ee7ea4191928a7c Click this link to run this code]'''
<syntaxhighlight lang="gambas">Public Sub Main()
Dim sValue As String[] = ["Zero", "One", "Two", "Three", "Four", "Five"]
Dim sKey As String[] = [0, 1, 2, 3, 4, 5]
Dim sCol As New Collection
Dim siCount As Short
 
For siCount = 0 To sKey.max
sCol.Add(sValue[siCount], sKey[siCount])
Next
 
For siCount = 0 To sKey.max
Print Str(sicount) & " = " & sCol[siCount]
Next
 
End</syntaxhighlight>
Output:
<pre>
0 = Zero
1 = One
2 = Two
3 = Three
4 = Four
5 = Five
</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 449 ⟶ 1,033:
}
fmt.Println(hash)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 457 ⟶ 1,041:
=={{header|Groovy}}==
 
<langsyntaxhighlight lang="groovy">def keys = ['a','b','c']
def vals = ['aaa', 'bbb', 'ccc']
def hash = [:]
keys.eachWithIndex { key, i ->
hash[key] = vals[i]
}</langsyntaxhighlight>
 
Alternative Version:
<syntaxhighlight lang="groovy">List.metaClass.hash = { list -> [delegate, list].transpose().collectEntries { [(it[0]): it[1]] } }</syntaxhighlight>
 
Test:
<syntaxhighlight lang="groovy">assert (['a', 'b', 'c'].hash(['aaa', 'bbb', 'ccc'])) == [a: 'aaa', b: 'bbb', c: 'ccc']</syntaxhighlight>
 
=={{header|Harbour}}==
<syntaxhighlight lang="visualfoxpro">LOCAL arr1 := { 6, "eight" }, arr2 := { 16, 8 }
LOCAL hash := { => }
LOCAL i, j
 
FOR EACH i, j IN arr1, arr2
hash[ i ] := j
NEXT</syntaxhighlight>
 
=={{header|Haskell}}==
{{works with|GHC|GHCi|6.6}}
 
<langsyntaxhighlight lang="haskell">import Data.Map
 
makeMap ks vs = fromList $ zip ks vs
mymap = makeMap ['a','b','c'] [1,2,3]</langsyntaxhighlight>
 
=={{header|Huginn}}==
<syntaxhighlight lang="huginn">from Algorithms import materialize, zip;
 
main() {
keys = [1, 2, 3];
values = ['a', 'b', 'c'];
hash = materialize( zip( key, values ), lookup );
}</syntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">link ximage # to format the structure
 
procedure main(arglist) #: demonstrate hash from 2 lists
Line 484 ⟶ 1,092:
 
write(ximage(T)) # show result
end</langsyntaxhighlight>
 
=={{header|Ioke}}==
<langsyntaxhighlight lang="ioke">{} addKeysAndValues([:a, :b, :c], [1, 2, 3])</langsyntaxhighlight>
 
=={{header|J}}==
What exactly is a hash?
 
We shall interpret 'hash' as "a function between some arbitrary values and some other arbitrary values". (Technically speaking a hash is more of a reference to a collection of techniques for achieving this, with something of an emphasis on an arbitrary and opaque intermediate result, than the actual end result. But people have spoken very glowingly of these techniques so let's pretend that the result actually matters.)
 
'''Solution:'''
<langsyntaxhighlight lang="j">hash=: vals {~ keys&i.</langsyntaxhighlight>
'''For example:'''
 
<langsyntaxhighlight lang="j"> keys=: 10?.100
vals=: > ;:'zero one two three four five six seven eight nine'
hash=: vals {~ keys&i.
Line 512 ⟶ 1,124:
six
seven
two</langsyntaxhighlight>
Here,<code> keys </code>is a list of 10 integers between 0 and 99 chosen atarbitrarily random(we like to call this "randomly" but there is some mathematical controversy about implementations of randomness) without repetition, and<code> vals </code>is a 10 by 5 character matrix.
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">import java.util.HashMap;
public static void main(String[] args){
String[] keys= {"a", "b", "c"};
Line 525 ⟶ 1,137:
hash.put(keys[i], vals[i]);
}
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
 
===Iterative===
<lang javascript>var keys = ['a', 'b', 'c'];
<syntaxhighlight lang="javascript">
var keys = ['a', 'b', 'c'];
var values = [1, 2, 3];
var map = {};
for(var i in= 0; i < keys.length; i += 1) {
map[ keys[i] ] = values[i];
}
}</lang>
</syntaxhighlight>
 
===Iterative Using Foreach===
<syntaxhighlight lang="javascript">
function arrToObj(keys, vals) {
var map = {};
keys.forEach(function (key, index) {
map[key] = val[index];
});
return map;
}
</syntaxhighlight>
 
===Using Reduce===
<syntaxhighlight lang="javascript">
function arrToObj(keys, vals) {
return keys.reduce(function(map, key, index) {
map[key] = vals[index];
return map;
}, {});
}
</syntaxhighlight>
 
=={{header|jq}}==
jq only supports hashing of strings. In the following, accordingly, we assume that
one array (keys) is an array of strings.
<syntaxhighlight lang="jq"># hash(keys) creates a JSON object with the given keys as keys
# and values taken from the input array in turn.
# "keys" must be an array of strings.
# The input array may be of any length and have values of any type,
# but only the first (keys|length) values will be used;
# the input will in effect be padded with nulls if required.
def hash(keys):
. as $values
| reduce range(0; keys|length) as $i
( {}; . + { (keys[$i]) : $values[$i] });
 
[1,2,3] | hash( ["a","b","c"] )</syntaxhighlight>
{{Out}}
<syntaxhighlight lang="jq">jq -n -f Hash_from_two_arrays.jq
{
"a": 1,
"b": 2,
"c": 3
}</syntaxhighlight>
To hash an array of distinct integers, the tostring filter can be used, e.g.
[10,20,30] | hash( [1,2,3] | map(tostring) )
yields:<syntaxhighlight lang="jq">{
"1": 10,
"2": 20,
"3": 30
}</syntaxhighlight>
 
=={{header|Jsish}}==
From Javascript.
<syntaxhighlight lang="javascript">/* Hash from two arrays, in Jsish */
function hashTwo(k:array, v:array):object {
var hash = {};
for (var i = 0; i < k.length; i++) hash[k[i]] = v[i];
return hash;
}
 
;hashTwo(['a','b','c'], [1,2,3]);
;hashTwo(['a','b'], [1,[2,4,8],3]);
;hashTwo(['a','b','c'], [1,2]);
;hashTwo([], []);
 
/*
=!EXPECTSTART!=
hashTwo(['a','b','c'], [1,2,3]) ==> { a:1, b:2, c:3 }
hashTwo(['a','b'], [1,[2,4,8],3]) ==> { a:1, b:[ 2, 4, 8 ] }
hashTwo(['a','b','c'], [1,2]) ==> { a:1, b:2, c:undefined }
hashTwo([], []) ==> {}
=!EXPECTEND!=
*/</syntaxhighlight>
{{out}}
<pre>prompt$ jsish -u hashTwo.jsi
[PASS] hashTwo.jsi</pre>
Use '''jsish --U hashTwo.jsi''' to see echo mode test lines.
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
 
'''Using comprehension''':
<syntaxhighlight lang="julia">k = ["a", "b", "c"]
v = [1, 2, 3]
 
Dict(ki => vi for (ki, vi) in zip(k, v))</syntaxhighlight>
 
'''Using constructor''':
<syntaxhighlight lang="julia">Dict(zip(keys, values))</syntaxhighlight>
 
'''Specifying types''':
<syntaxhighlight lang="julia">Dict{String,Int32}(zip(keys, values))</syntaxhighlight>
 
=={{header|K}}==
The keys in a dictionary must be a symbol.
<langsyntaxhighlight Klang="k"> a: `zero `one `two / symbols
b: 0 1 2
 
Line 547 ⟶ 1,255:
 
d[`one]
1</langsyntaxhighlight>
 
Here we use integers as keys (which must be converted to symbols) and strings as values (here also converted to symbols).
 
<langsyntaxhighlight Klang="k"> keys: !10 / 0..9
split:{1_'(&x=y)_ x:y,x}
vals:split["zero one two three four five six seven eight nine";" "]
Line 569 ⟶ 1,277:
 
$d[s 1] / leading "$" converts back to string
"one"</langsyntaxhighlight>
 
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">// version 1.1.0
 
fun main(args: Array<String>) {
val names = arrayOf("Jimmy", "Bill", "Barack", "Donald")
val ages = arrayOf(92, 70, 55, 70)
val hash = mapOf(*names.zip(ages).toTypedArray())
hash.forEach { println("${it.key.padEnd(6)} aged ${it.value}") }
}</syntaxhighlight>
 
{{out}}
<pre>
Jimmy aged 92
Bill aged 70
Barack aged 55
Donald aged 70
</pre>
 
=={{header|Lang5}}==
<syntaxhighlight lang="lang5">: >table 2 compress -1 transpose ;
['one 'two 'three 'four] [1 2 3 4] >table</syntaxhighlight>
 
=={{header|langur}}==
=== the easy way ===
<syntaxhighlight lang="langur">writeln(hash fw/a b c d/, [1, 2, 3, 4])
</syntaxhighlight>
 
Note that fw/a b c d/ is a semantic convenience equivalent to ["a", "b", "c", "d"].
 
=== a longer way ===
Using the append operator would silently overwrite hash values for matching keys, but the more() function will not.
<syntaxhighlight lang="langur">val .new = foldfrom(
fn(.hash, .key, .value) more .hash, {.key: .value},
hash(), fw/a b c d/, [1, 2, 3, 4],
)
 
writeln .new</syntaxhighlight>
 
{{out}}
<pre>{"d": 4, "a": 1, "b": 2, "c": 3}</pre>
 
=={{header|Lasso}}==
<syntaxhighlight lang="lasso">local(
array1 = array('a', 'b', 'c'),
array2 = array(1, 2, 3),
hash = map
)
 
loop(#array1 -> size) => {
#hash -> insert(#array1 -> get(loop_count) = #array2 -> get(loop_count))
}
 
#hash</syntaxhighlight>
-> map(a = 1, b = 2, c = 3)
 
=={{header|LFE}}==
<syntaxhighlight lang="lisp">(let* ((keys (list 'foo 'bar 'baz))
(vals (list '"foo data" '"bar data" '"baz data"))
(tuples (: lists zipwith
(lambda (a b) (tuple a b)) keys vals))
(my-dict (: dict from_list tuples)))
(: io format '"fetched data: ~p~n" (list (: dict fetch 'baz my-dict))))
</syntaxhighlight>
 
=={{header|Lingo}}==
<syntaxhighlight lang="lingo">keys = ["a","b","c"]
values = [1,2,3]
 
props = [:]
cnt = keys.count
repeat with i = 1 to cnt
props[keys[i]] = values[i]
end repeat
 
put props
-- ["a": 1, "b": 2, "c": 3]</syntaxhighlight>
 
=={{header|LiveCode}}==
<syntaxhighlight lang="livecode">put "a,b,c" into list1
put 10,20,30 into list2
split list1 using comma
split list2 using comma
repeat with i=1 to the number of elements of list1
put list2[i] into list3[list1[i]]
end repeat
combine list3 using comma and colon
put list3
 
-- ouput
-- a:10,b:20,c:30</syntaxhighlight>
 
=={{header|Lua}}==
<syntaxhighlight lang="lua">function(keys,values)
<lang lua>
function(keys,values)
local t = {}
for i=1, #keys do
t[keys[i]] = values[i]
end
end</syntaxhighlight>
end
</lang>
 
=={{header|MathematicaM2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
<lang Mathematica>Map[(Hash[Part[#, 1]] = Part[#, 2]) &,
Module CheckAll {
Module CheckVectorType {
Dim Keys$(4), Values(4)
Keys$(0):= "one","two","three","four"
Values(0):=1,2,3,4
Inventory Dict
For i=0 to 3 {
Append Dict, Keys$(i):=Values(i)
}
Print Dict("one")+Dict("four")=Dict("two")+Dict("three") ' true
}
Module CheckVectorType1 {
Dim Keys$(4), Values$(4)
Keys$(0):= "one","two","three","four"
Values$(0):="*","**","***","****"
Inventory Dict
For i=0 to 3 {
Append Dict, Keys$(i):=Values$(i)
}
Print Dict$("one")+Dict$("four")=Dict$("two")+Dict$("three") ' true
}
CheckVectorType
CheckVectorType1
}
CheckAll
</syntaxhighlight>
 
This is the real task, using two arrays as arguments in a function which return the hash table (an inventory object). Each pair has a key and a stack object. If a key found more than one we simply add to stack (at the bottom using Data - or at the top using Push). A module PrintKeyItems get the hash, the key to find, and the second array with values, and apply indexes from hash to array. The MakeHash add indexes using start value of array of values. So we can pass arrays with different start and end index, but they must be one dimension and have same number of items, else we get error
 
 
<syntaxhighlight lang="m2000 interpreter">
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
</syntaxhighlight>
 
=={{header|Maple}}==
<syntaxhighlight lang="maple">A := [1, 2, 3];
B := ["one", "two", three"];
T := table( zip( `=`, A, B ) );</syntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">Map[(Hash[Part[#, 1]] = Part[#, 2]) &,
Transpose[{{1, 2, 3}, {"one", "two", "three"}}]]
 
Line 588 ⟶ 1,466:
->Hash[1]=one
->Hash[2]=two
->Hash[3]=three</langsyntaxhighlight>
 
=={{header|MATLAB}} / {{header|Octave}}==
See [[Associative arrays/Creation#MATLAB_.2F_Octave|Associative arrays/Creation]] for clarification of limitations and differences between the two methods.
===MATLAB/Octave: structs===
<syntaxhighlight lang="matlab">function s = StructFromArrays(allKeys, allVals)
% allKeys must be cell array of strings of valid field-names
% allVals can be cell array or array of numbers
% Assumes arrays are same size and valid types
s = struct;
if iscell(allVals)
for k = 1:length(allKeys)
s.(allKeys{k}) = allVals{k};
end
else
for k = 1:length(allKeys)
s.(allKeys{k}) = allVals(k);
end
end
end</syntaxhighlight>
{{out}}
<pre>>> ages = StructFromArrays({'Joe' 'Bob' 'Sue'}, [21 35 27])
 
ages =
 
Joe: 21
Bob: 35
Sue: 27</pre>
 
===MATLAB only: containers.Map===
containers.Map constructor provides this functionality already.
<pre>>> ages = containers.Map({'Joe' 'Bob' 'Sue'}, [21 35 27]);
>> keys(ages)
 
ans =
 
'Bob' 'Joe' 'Sue'
 
>> values(ages)
 
ans =
 
[35] [21] [27]</pre>
 
=={{header|MiniScript}}==
<syntaxhighlight lang="miniscript">keys = ["foo", "bar", "val"]
values = ["little", "miss", "muffet"]
 
d = {}
for i in range(keys.len-1)
d[keys[i]] = values[i]
end for
 
print d</syntaxhighlight>
{{out}}
<pre>{"bar": "miss", "foo": "little", "val": "muffet"}</pre>
 
=={{header|Neko}}==
<syntaxhighlight lang="actionscript">/**
<doc><h2>Hash from two arrays, in Neko</h2></doc>
**/
 
var sprintf = $loader.loadprim("std@sprintf", 2)
 
var array_keys = $array("one",2,"three",4,"five")
var array_vals = $array("six",7,"eight",9,"zero")
var elements = $asize(array_keys)
 
var table = $hnew(elements)
 
var step = elements
while (step -= 1) >= 0 $hadd(table, $hkey(array_keys[step]), array_vals[step])
 
/*
$hiter accepts a hashtable and a function that accepts two args, key, val
*/
var show = function(k, v) $print("Hashed key: ", sprintf("%10d", k), " Value: ", v, "\n")
$hiter(table, show)</syntaxhighlight>
 
{{out}}
<pre>prompt$ nekoc hash-two-arrays.neko
prompt$ neko hash-two-arrays.n
Hashed key: 13898426 Value: eight
Hashed key: 38662 Value: six
Hashed key: 2 Value: 7
Hashed key: 4 Value: 9
Hashed key: 737454 Value: zero</pre>
 
=={{header|Nemerle}}==
<syntaxhighlight lang="nemerle">using System;
using System.Console;
using Nemerle.Collections;
using Nemerle.Collections.NCollectionsExtensions;
 
module AssocArray
{
Main() : void
{
def list1 = ["apples", "oranges", "bananas", "kumquats"];
def list2 = [13, 34, 12];
def inventory = Hashtable(ZipLazy(list1, list2));
foreach (item in inventory)
WriteLine("{0}: {1}", item.Key, item.Value);
}
}</syntaxhighlight>
 
=={{header|NetRexx}}==
=== REXX Style ===
<lang netrexx>/* NetRexx program ****************************************************
{{trans|REXX}}
<syntaxhighlight lang="netrexx">/* NetRexx program ****************************************************
* 04.11.2012 Walter Pachl derived from REXX
**********************************************************************/
Line 612 ⟶ 1,596:
Say ' 'keys
Parse Ask z
Say z '->' value[z]</langsyntaxhighlight>
 
=== Java Collections ===
<lang Nemerle>using System;
NetRexx has access to Java's Collection objects too.
using System.Console;
<syntaxhighlight lang="netrexx">/* NetRexx */
using Nemerle.Collections;
options replace format comments java crossref symbols nobinary
using Nemerle.Collections.NCollectionsExtensions;
 
vals = [ 'zero', 'one', 'two', 'three', 'four', 'five' ]
module AssocArray
keys = [ 'k0', 'k1', 'k2', 'k3', 'k4', 'k5' ]
{
hash1 = Rexx
Main() : void
hash2 = Map
{
 
def list1 = ["apples", "oranges", "bananas", "kumquats"];
hash1 = HashMap()
def list2 = [13, 34, 12];
hash2 = ''
def inventory = Hashtable(ZipLazy(list1, list2));
makeHash(hash1, keys, vals) -- using a Map object (overloaded method)
foreach (item in inventory)
makeHash(hash2, keys, vals) -- using a Rexx object (overloaded method)
WriteLine("{0}: {1}", item.Key, item.Value);
 
}
return
}</lang>
 
-- Using a Java collection object
method makeHash(hash = Map, keys = Rexx[], vals = Rexx[]) static
loop k_ = 0 to keys.length - 1
hash.put(keys[k_], vals[k_])
end k_
 
key = Rexx
loop key over hash.keySet()
say key.right(8)':' hash.get(key)
end key
say
 
return
 
-- For good measure a version using the default Rexx object as a hash (associative array)
method makeHash(hash = Rexx, keys = Rexx[], vals = Rexx[]) static
loop k_ = 0 to keys.length - 1
hash[keys[k_]] = vals[k_]
end k_
 
loop key over hash
say key.right(8)':' hash[key]
end key
say
 
return
</syntaxhighlight>
 
=={{header|Nim}}==
<syntaxhighlight lang="nim">import tables, sequtils
 
let keys = @['a','b','c']
let values = @[1, 2, 3]
 
let table = toTable zip(keys, values)</syntaxhighlight>
 
=={{header|Oberon-2}}==
Works with oo2c version 2
<syntaxhighlight lang="oberon2">
MODULE HashFromArrays;
IMPORT
ADT:Dictionary,
Object:Boxed;
TYPE
Key= STRING;
Value= Boxed.LongInt;
PROCEDURE Do;
VAR
a: ARRAY 128 OF Key;
b: ARRAY 128 OF Value;
hash: Dictionary.Dictionary(Key,Value);
i: INTEGER;
BEGIN
hash := NEW(Dictionary.Dictionary(Key,Value));
a[0] := "uno";
a[1] := "dos";
a[2] := "tres";
a[3] := "cuatro";
b[0] := Boxed.ParseLongInt("1");
b[1] := Boxed.ParseLongInt("2");
b[2] := Boxed.ParseLongInt("3");
b[3] := Boxed.ParseLongInt("4");
i := 0;
WHILE (i < LEN(a)) & (a[i] # NIL) DO
hash.Set(a[i],b[i]);
INC(i)
END;
END Do;
BEGIN
Do;
END HashFromArrays.
</syntaxhighlight>
 
=={{header|Objeck}}==
 
<langsyntaxhighlight lang="objeck">
use Structure;
 
Line 648 ⟶ 1,708:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Objective-C}}==
 
<langsyntaxhighlight lang="objc">NSArray *keys = @[NSArray arrayWithObjects:@"a", @"b", @"c", nil];
NSArray *values = @[NSArray@1, arrayWithObjects:[NSNumber@2, numberWithInt:1@3],;
NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys];</syntaxhighlight>
[NSNumber numberWithInt:2],
[NSNumber numberWithInt:3], nil];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys];</lang>
 
=={{header|OCaml}}==
The idiomatic solution uses lists rather than arrays.
 
<langsyntaxhighlight lang="ocaml">let keys = [ "foo"; "bar"; "baz" ]
and vals = [ 16384; 32768; 65536 ]
and hash = Hashtbl.create 0;;
 
List.iter2 (Hashtbl.add hash) keys vals;;</langsyntaxhighlight>
 
The solution is similar with arrays.
In the extremely unlikely event that it was actually necessary to use arrays, the solution would become slightly less elegant:
(except using the ExtLib which provides the equivalent Array.iter2)
 
<langsyntaxhighlight lang="ocaml">let keys = [| "foo"; "bar"; "baz" |]
and vals = [| 16384; 32768; 65536 |]
and hash = Hashtbl.create 0;;
 
Array.iter2 (Hashtbl.add hash) keys vals;;</syntaxhighlight>
for i = 0 to Array.length keys - 1 do
Hashtbl.add hash keys.(i) vals.(i)
done;;</lang>
 
In either case, an exception is raised if the inputs are different lengths.
Line 682 ⟶ 1,737:
If you want to use functional binary search trees instead of hash tables:
 
<langsyntaxhighlight lang="ocaml">module StringMap = Map.Make (String);;
 
let keys = [ "foo"; "bar"; "baz" ]
Line 688 ⟶ 1,743:
and map = StringMap.empty;;
 
let map = List.fold_right2 StringMap.add keys vals map;;</langsyntaxhighlight>
 
=={{header|ooRexx}}==
<syntaxhighlight lang="oorexx">array1 = .array~of("Rick", "Mike", "David")
<lang ooRexx>
array1 = .array~of("Rick", "Mike", "David")
array2 = .array~of("555-9862", "555-5309", "555-6666")
 
Line 702 ⟶ 1,756:
hash[array1[i]] = array2[i]
end
Say 'Enter a name'
</lang>
Parse Pull name
Say name '->' hash[name]</syntaxhighlight>
{{out}}
<pre>Enter a name
Rick
Rick -> 555-9862</pre>
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">declare
fun {ZipRecord Keys Values}
{List.toRecord unit {List.zip Keys Values MakePair}}
Line 713 ⟶ 1,774:
end
in
{Show {ZipRecord [a b c] [1 2 3]}}</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
 
<syntaxhighlight lang="parigp">hash(key, value)=Map(matrix(#key,2,x,y,if(y==1,key[x],value[x])));</syntaxhighlight>
 
=={{header|Pascal}}==
{{works with|Free_Pascal}}
{{libheader|contnrs}}
<langsyntaxhighlight lang="pascal">program HashFromTwoArrays (Output);
 
uses
Line 735 ⟶ 1,800:
writeln ('Length of hash table: ', hash.Count);
hash.Destroy;
end.</langsyntaxhighlight>
{{out}}
Output:
<pre>% ./HashFromTwoArrays
Length of hash table: 3
Line 742 ⟶ 1,807:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">my @keys = qw(a b c);
my @vals = (1, 2, 3);
my %hash;
@hash{@keys} = @vals;</langsyntaxhighlight>
 
Alternatively, using {{libheader|List::MoreUtils}}:
 
<langsyntaxhighlight lang="perl">use List::MoreUtils qw(zip);
my %hash = zip @keys, @vals;</langsyntaxhighlight>
 
=={{header|Perl 6Phix}}==
You could of course make the values in the dictionary be indexes to valuearray instead, as shown commented out.
{{works with|Rakudo|#23 "Lisbon"}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">make_hash</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">keyarray</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">valuearray</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">dict</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">new_dict</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">keyarray</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #7060A8;">setd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">keyarray</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #000000;">valuearray</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #000000;">dict</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- setd(keyarray[i],i,dict)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">dict</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">keyarray</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"two"</span><span style="color: #0000FF;">,</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">valuearray</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"one"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">}</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">dict</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">make_hash</span><span style="color: #0000FF;">(</span><span style="color: #000000;">keyarray</span><span style="color: #0000FF;">,</span><span style="color: #000000;">valuearray</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">getd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dict</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">getd</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"two"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dict</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">getd</span><span style="color: #0000FF;">(</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dict</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">--?valuearray[getd(1,dict)]</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
"one"
2
3.141592654
</pre>
 
=={{header|Phixmonti}}==
<lang perl6>my @keys = <a b c d e>;
<syntaxhighlight lang="phixmonti">include ..\Utilitys.pmt
my @vals = ^5;
my %hash = @keys Z @vals;</lang>
 
def getd /# array key -- array data #/
or just
swap 1 get rot find nip
dup if
swap 2 get rot get nip
else
drop "Unfound"
endif
enddef
 
( ( 1 "two" PI ) ( "one" 2 PI ) ) /# keys / data #/
<lang perl6>my @v = <a b c d e>;
my %hash = @v Z @v.keys;</lang>
 
1 getd print nl
 
"two" getd print nl
Alternatively:
PI getd tostr print nl
 
3 getd print</syntaxhighlight>
<lang perl6>my %hash;
{{out}}
%hash{@keys} = @vals;</lang>
<pre>
 
one
To create an anonymous hash value, you can use Z as a "zipwith" metaoperator on the => pair composer:
2
 
3.141592653589793
<lang perl6>{ <a b c d e> Z=> ^5 }</lang>
Unfound
</pre>
 
=={{header|PHP}}==
{{works with|PHP|5}}
<langsyntaxhighlight lang="php">$keys = array('a', 'b', 'c');
$values = array(1, 2, 3);
$hash = array_combine($keys, $values);</langsyntaxhighlight>
 
{{works with|PHP|4}}
<langsyntaxhighlight lang="php">$keys = array('a', 'b', 'c');
$values = array(1, 2, 3);
$hash = array();
for ($idx = 0; $idx < count($keys); $idx++) {
$hash[$keys[$idx]] = $values[$idx];
}</langsyntaxhighlight>
 
=={{header|Picat}}==
<syntaxhighlight lang="picat">go =>
A = [a,b,c,d,e],
B = [1,2,3,4,5],
Map = new_map([K=V : {K,V} in zip(A,B)]),
println(Map).</syntaxhighlight>
 
{{out}}
<pre>(map)[d = 4,c = 3,b = 2,a = 1,e = 5]</pre>
 
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(let (Keys '(one two three) Values (1 2 3))
(mapc println
(mapcar cons Keys Values) ) )</langsyntaxhighlight>
{{out}}
Output:
<pre>(one . 1)
(two . 2)
(three . 3)</pre>
 
=={{header|Pike}}==
Any data type can be used as indices (keys) and values.
<syntaxhighlight lang="pike">
array indices = ({ "a", "b", 42 });
array values = ({ Image.Color(0,0,0), "hello", "world" });
mapping m = mkmapping( indices, values );
write("%O\n", m);
</syntaxhighlight>
{{Out}}
<pre>
([ /* 3 elements */
"a": Image.Color.black,
"b": "hello"
42: "world",
])
</pre>
 
=={{header|Pop11}}==
 
<langsyntaxhighlight lang="pop11">vars keys = { 1 a b c};
vars vals = { 2 3 valb valc};
vars i;
Line 807 ⟶ 1,932:
for i from 1 to length(keys) do
vals(i) -> ht(keys(i));
endfor;</langsyntaxhighlight>
 
=={{header|PostScript}}==
{{libheader|initlib}}
<langsyntaxhighlight lang="postscript">
% push our arrays
[/a /b /c /d /e] [1 2 3 4 5]
Line 818 ⟶ 1,943:
% show that we have created the hash
{= =} forall
</syntaxhighlight>
</lang>
 
=={{header|PowerShell}}==
<langsyntaxhighlight lang="powershell">function create_hash ([array] $keys, [array] $values) {
$h = @{}
if ($keys.Length -ne $values.Length) {
Line 832 ⟶ 1,958:
}
return $h
}</langsyntaxhighlight>
 
=={{header|Prolog}}==
 
<langsyntaxhighlight lang="prolog">% this one with side effect hash table creation
 
:-dynamic hash/2.
Line 854 ⟶ 1,980:
make_hash_pure(Q,Q1,R).
 
:-make_hash_pure([un,deux,trois],[[a,b,c],[d,e,f],[g,h,i]],L),findall(M,(member(M,L),assert(M)),L).</langsyntaxhighlight>
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Dim keys.s(3)
Dim vals.s(3)
NewMap Hash.s()
Line 868 ⟶ 1,994:
ForEach Hash()
Debug Hash()
Next</langsyntaxhighlight>
 
=={{header|Python}}==
{{works with|Python|3.0+ and 2.7}}
Shows off the dict comprehensions in Python 3 (that were back-ported to 2.7):
<syntaxhighlight lang="python">keys = ['a', 'b', 'c']
values = [1, 2, 3]
hash = {key: value for key, value in zip(keys, values)}</syntaxhighlight>
 
{{works with|Python|2.2+}}
<langsyntaxhighlight lang="python">keys = ['a', 'b', 'c']
values = [1, 2, 3]
hash = dict(zip(keys, values))
Line 878 ⟶ 2,010:
# Lazily, Python 2.3+, not 3.x:
from itertools import izip
hash = dict(izip(keys, values))</langsyntaxhighlight>
 
{{works with|Python|3.0+}}
Shows off the dict comprehensions in Python 3:
<lang python>keys = ['a', 'b', 'c']
values = [1, 2, 3]
hash = {key: value for key, value in zip(keys, values)}</lang>
 
{{works with|Python|2.0+}}
<langsyntaxhighlight lang="python">keys = ['a', 'b', 'c']
values = [1, 2, 3]
hash = {}
for k,v in zip(keys, values):
hash[k] = v</langsyntaxhighlight>
 
The original (Ruby) example uses a range of different types as keys. Here is similar in python (run at the shell):
<langsyntaxhighlight lang="python">>>> class Hashable(object):
def __hash__(self):
return id(self) ^ 0xBEEF
Line 934 ⟶ 2,060:
<__main__.Hashable object at 0x012AFC50> : 0
>>> # Notice that the key "True" disappeared, and its value got associated with the key "1"
>>> # This is because 1 == True in Python, and dictionaries cannot have two equal keys</langsyntaxhighlight>
 
=={{header|R}}==
Assuming that the keys are coercible to character form, we can simply use the names attribute to create a hash. This example is taken from the [[wp:Hash_table#Separate_chaining|Wikipedia page on hash tables]].
<langsyntaxhighlight lang="r"># Set up hash table
keys <- c("John Smith", "Lisa Smith", "Sam Doe", "Sandra Dee", "Ted Baker")
values <- c(152, 1, 254, 152, 153)
Line 945 ⟶ 2,071:
values["Sam Doe"] # vals["Sam Doe"]
# Get all keys corresponding to a value
names(values)[values==152] # "John Smith" "Sandra Dee"</langsyntaxhighlight>
 
=={{header|Racket}}==
<syntaxhighlight lang="racket">
<lang scheme>(make-hash
(make-hash (map cons '("a" "b" "c" "d") '(1 2 3 4)))</syntaxhighlight>
(map cons
 
'("a" "b" "c" "d")
Alternatively:
'(1 2 3 4)))</lang>
<syntaxhighlight lang="racket">
(define (connect keys vals) (for/hash ([k keys] [v vals]) (values k v)))
;; Example:
(connect #("a" "b" "c" "d") #(1 2 3 4))
</syntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
 
Using the "zipwith" meta-operator on the <tt>=></tt> pair composer:
 
{{works with|rakudo|2018.03}}
<syntaxhighlight lang="raku" line>my @keys = <a b c d e>;
my @values = ^5;
 
my %hash = @keys Z=> @values;
 
 
#Alternatively, by assigning to a hash slice:
%hash{@keys} = @values;
 
 
# Or to create an anonymous hash:
%( @keys Z=> @values );
 
 
# All of these zip forms trim the result to the length of the shorter of their two input lists.
# If you wish to enforce equal lengths, you can use a strict hyperoperator instead:
 
quietly # suppress warnings about unused hash
{ @keys »=>« @values }; # Will fail if the lists differ in length</syntaxhighlight>
 
=={{header|Raven}}==
 
<langsyntaxhighlight lang="raven">[ 'a' 'b' 'c' ] as $keys [ 1 2 3 ] as $vals
$keys $vals combine as $hash</langsyntaxhighlight>
 
=={{header|REXX}}==
This REXX version allows multiple keys for a value, &nbsp; the keys are case sensitive.
<lang rexx>/*REXX program demonstrate hashing of a stemmed array (from a key). */
<syntaxhighlight lang="rexx">/*REXX program demonstrates hashing of a stemmed array (from a key or multiple keys)*/
/*names of the 9 regular polygons*/
key.= /*names of the nine regular polygons. */
values='triangle quadrilateral pentagon hexagon heptagon octagon nonagon decagon dodecagon'
vals= 'triangle quadrilateral pentagon hexagon heptagon octagon nonagon decagon dodecagon'
keys ='thuhree vour phive sicks zeaven ate nein den duzun'
key.1='thuhree vour phive sicks zeaven ate nein den duzun'
key.2='three four five six seven eight nine ten twelve'
key.3='3 4 5 6 7 8 9 10 12'
key.4='III IV V VI VII VIII IX X XII'
key.5='iii iv v vi vii viii ix x xii'
hash.='───(not defined)───' /* [↑] blanks added to humorous keys */
/* just because it looks prettier.*/
do k=1 while key.k\==''
call hash vals,key.k /*hash the keys to the values. */
end /*k*/
 
parse arg query . /*obtain what was specified on the C.L.*/
/*superflous blanks added to humorous keys just 'cause it looks prettier*/
if query\=='' then say 'key:' left(query,40) "value:" hash.query
call hash values,keys /*hash the keys to the values. */
parseexit arg query . /*whatstick wasa specifiedfork onin cmdit, line we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
if query=='' then exit /*nothing, then let's leave Dodge*/
hash: parse arg @val,@key
pad=left('',30) /*used for padding the display. */
do j=1 for words(@key); map= word(@key, j)
say 'key:' query pad "value:" hash.query /*show & tell some stuff.*/
exit /*stick a fork in it, we're done hash.*/map= word(@val, j)
end /*j*/
/*──────────────────────────────────HASH subroutine─────────────────────*/
return</syntaxhighlight>
hash: procedure expose hash.; parse arg v,k,hash.
{{out|output|text=&nbsp; when using the input value of: &nbsp; &nbsp; <tt> phive </tt>}}
do j=1 until map=''; map=word(k,j)
<pre>
hash.map=word(v,j)
key: phive end /*j*/ value: pentagon
return</langpre>
'''{{out|output'''|text=&nbsp; when using the input value of: &nbsp; &nbsp; <tt> phivedingsta </tt>}}
<pre>
<pre style="overflow:scroll">
key: phivedingsta value: pentagon───(not defined)───
</pre>
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
# Project : Hash from two arrays
 
list1="one two three"
list2="1 2 3"
a = str2list(substr(list1," ",nl))
b = str2list(substr(list2," ",nl))
c = list(len(a))
for i=1 to len(b)
temp = number(b[i])
c[temp] = a[i]
next
for i = 1 to len(c)
see c[i] + " " + i + nl
next
</syntaxhighlight>
Output:
<pre>
one 1
two 2
three 3
</pre>
 
=={{header|RPL}}==
≪ <span style="color:red">2</span> →LIST ≫ '<span style="color:blue">→HASH</span>' STO
≪ OVER <span style="color:red">1</span> GET SWAP POS
SWAP <span style="color:red">2</span> GET
SWAP GET
≫ '<span style="color:blue">HASH→</span>' STO
 
<span style="color:red">{ "one" "two" "three" } { 1 2 3 }</span> <span style="color:blue">→HASH</span>
DUP '<span style="color:green">MYHASH</span>' STO
<span style="color:green">MYHASH</span> <span style="color:red">2</span> <span style="color:blue">HASH→</span>
{{out}}
<pre>
2: { { 1 2 3 } { "one" "two" "three" } }
1: "two"
</pre>
 
=={{header|Ruby}}==
<syntaxhighlight lang="ruby">
<lang ruby>keys=['hal',666,[1,2,3]]
valskeys = ['ibmhal','devil'666,[1,2,1233]]
vals = ['ibm','devil',123]
 
hash = Hash[keys.zip(vals)]
if RUBY_VERSION >= '1.8.7'
# Easy way, but needs Ruby 1.8.7 or later.
hash = Hash[keys.zip(vals)]
else
hash = keys.zip(vals).inject({}) {|h, kv| h.store(*kv); h }
end
 
p hash # => {"hal"=>"ibm", 666=>"devil", [1, 2, 3]=>123}
 
#retrieve the value linked to the key [1,2,3]
puts hash[ [1,2,3] ] # => 123</lang>
</syntaxhighlight>
 
OrIn defineRuby a2.1 newthe method in"to_h" classwas Arrayintroduced:
<syntaxhighlight lang="ruby">keys = ['hal', 666, [1,2,3]]
vals = ['ibm', 'devil', 123]
 
keys.zip(vals).to_h</syntaxhighlight>
<lang ruby>class Array
def zip_hash(other)
Hash[*(0...self.size).inject([]) { |arr, ix|
arr.push(self[ix], other[ix]) } ]
end
end
 
=={{header|Rust}}==
hash = %W{ a b c }.zip_hash( %W{ 1 2 3 } )
<syntaxhighlight lang="rust">use std::collections::HashMap;
p hash # => {"a"=>"1", "b"=>"2", "c"=>"3"}</lang>
 
fn main() {
Reference from [http://programmingbulls.com/ruby-array-hash Ruby Array to Hash]
let keys = ["a", "b", "c"];
let values = [1, 2, 3];
 
let hash = keys.iter().zip(values.iter()).collect::<HashMap<_, _>>();
println!("{:?}", hash);
}</syntaxhighlight>
 
=={{header|Sather}}==
<langsyntaxhighlight lang="sather">class ZIPPER{K,E} is
zip(k:ARRAY{K}, e:ARRAY{E}) :MAP{K, E}
pre k.size = e.size
Line 1,035 ⟶ 2,243:
end;
 
end;</langsyntaxhighlight>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">val keys = ArrayList(1, 2, 3)
val values = Array("A", "B", "C") // Array mixed with List
val map = keys.zip(values).toMap< /lang>/ and other Seq are possible.
 
// Testing
assert(map == Map(1 ->"A", 2 -> "B", 3 -> "C"))
println("Successfully completed without errors.")</syntaxhighlight>
 
=={{header|Scheme}}==
=== Using [http://srfi.schemers.org/srfi-69/srfi-69.html SRFI 69]: ===
<langsyntaxhighlight lang="scheme">(define (lists->hash-table keys values . rest)
(apply alist->hash-table (map cons keys values) rest))</langsyntaxhighlight>
 
=== Using association lists ===
<syntaxhighlight lang="scheme">;; Using SRFI-1, R6RS, or R7RS association lists.
 
;; Because the task calls for ‘arrays’, I start with actual arrays
;; rather than lists.
(define array1 (vector "a" "b" "c" "d"))
(define array2 (vector 1 2 3 4))
 
;; Making the hash is just a simple list operation.
(define dictionary (map cons (vector->list array1)
(vector->list array2)))
 
;; Now you can look up associations with assoc.
(write (assoc "b" dictionary)) (newline)
(write (assoc "d" dictionary)) (newline)
 
;; USING CHICKEN 5 SCHEME, OUTPUT FROM EITHER
;; ‘csc -R srfi-1 thisprog.scm && ./thisprog’
;; OR ‘csc -R r7rs thisprog.scm && ./thisprog’,
;; AND ALSO TESTED IN CHEZ SCHEME (R6RS):
;;
;; ("b" . 2)
;; ("d" . 4)
;;</syntaxhighlight>
 
=== Using [[Associative_array/Creation#A_persistent_associative_array_from_scratch|''persistent'' associative arrays]] ===
 
You need to compile this code along with the [[Associative_array/Creation#A_persistent_associative_array_from_scratch|persistent associative arrays]] code. And, yes, the hash function for that implementation ''can'' return floating point numbers, the way the one here does.
 
<syntaxhighlight lang="scheme">(import (associative-arrays))
 
;; Because the task calls for ‘arrays’, I start with actual arrays
;; rather than lists.
(define array1 (vector "a" "b" "c" "d"))
(define array2 (vector 1 2 3 4))
 
(define (silly-hashfunc s)
(define h 1234)
(do ((i 0 (+ i 1)))
((= i (string-length s)))
(set! h (+ h (char->integer (string-ref s i)))))
(sqrt (/ (* h 101) 9.80665)))
 
;; Here is the making of the associative array:
(define dictionary (assoc-array silly-hashfunc))
(vector-for-each (lambda (key data)
(set! dictionary
(assoc-array-set dictionary key data)))
array1 array2)
 
(display "Looking up \"b\" and \"d\": ")
(write (assoc-array-ref dictionary "b"))
(display " ")
(write (assoc-array-ref dictionary "d"))
(newline)
 
;; Output:
;;
;; Looking up "b" and "d": 2 4
;;</syntaxhighlight>
 
Side note: association lists can be used in either a persistent or non-persistent manner.
 
=={{header|Seed7}}==
 
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const type: numericHash is hash [string] integer;
Line 1,063 ⟶ 2,338:
myHash @:= [keyList[number]] valueList[number];
end for;
end func;</langsyntaxhighlight>
 
=={{header|SenseTalk}}==
<syntaxhighlight lang="sensetalk">
set keyList to ["red", "green", "blue"]
set valueList to [150,0,128]
 
repeat with n=1 to the number of items in keyList
set map.(item n of keyList) to item n of valueList
end repeat
 
put map
--> (blue:"128", green:"0", red:"150")
 
</syntaxhighlight>
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">var keys = %w(a b c)
var vals = [1, 2, 3]
 
var hash = Hash()
hash{keys...} = vals...
say hash</syntaxhighlight>
 
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}
 
<langsyntaxhighlight lang="smalltalk">Array extend [
dictionaryWithValues: array [ |d|
d := Dictionary new.
Line 1,080 ⟶ 2,377:
 
({ 'red' . 'one' . 'two' }
dictionaryWithValues: { '#ff0000'. 1. 2 }) displayNl.</langsyntaxhighlight>
 
{{works with|Smalltalk/X}}
{{works with|VisualWorks Smalltalk}}
<syntaxhighlight lang="smalltalk">Dictionary
withKeys:#('one' 'two' 'three')
andValues:#('eins' 'zwei' 'drei')</syntaxhighlight>
 
{{works with|Smalltalk/X}}
<syntaxhighlight lang="smalltalk">Dictionary withAssociations:{ 'one'->1 . 'two'->2 . 'three'->3 }</syntaxhighlight>
 
=={{header|SNOBOL4}}==
Line 1,088 ⟶ 2,394:
{{works with|CSnobol}}
 
<langsyntaxhighlight SNOBOL4lang="snobol4">* # Fill arrays
keys = array(5); vals = array(5)
ks = 'ABCDE'; vs = '12345'
Line 1,103 ⟶ 2,409:
str = str ch ':' hash<ch> ' ' :(tloop)
out output = str
end</langsyntaxhighlight>
 
{{out}}
Output:
<pre>A:1 B:2 C:3 D:4 E:5</pre>
 
=={{header|Sparkling}}==
<syntaxhighlight lang="sparkling">let keys = { "foo", "bar", "baz" };
let vals = { 13, 37, 42 };
var hash = {};
for var i = 0; i < sizeof keys; i++ {
hash[keys[i]] = vals[i];
}</syntaxhighlight>
 
=={{header|Standard ML}}==
Line 1,112 ⟶ 2,426:
Using functional binary search trees instead of hash tables:
 
<langsyntaxhighlight lang="sml">structure StringMap = BinaryMapFn (struct
type ord_key = string
val compare = String.compare
Line 1,121 ⟶ 2,435:
and myMap = StringMap.empty;
 
val myMap = foldl StringMap.insert' myMap (ListPair.zipEq (keys, vals));</langsyntaxhighlight>
 
{{works with|SML/NJ}}
Using hash tables:
 
<langsyntaxhighlight lang="sml">exception NotFound;
 
val keys = [ "foo", "bar", "baz" ]
Line 1,132 ⟶ 2,446:
and hash = HashTable.mkTable (HashString.hashString, op=) (42, NotFound);
 
ListPair.appEq (HashTable.insert hash) (keys, vals);</langsyntaxhighlight>
 
=={{header|Swift}}==
{{works with|Swift|1.2+}}
<syntaxhighlight lang="swift">let keys = ["a","b","c"]
let vals = [1,2,3]
var hash = [String: Int]()
for (key, val) in zip(keys, vals) {
hash[key] = val
}</syntaxhighlight>
 
=={{header|Tcl}}==
 
Arrays in Tcl are automatically associative, i.e. there are no "not hashed arrays". If we can take "arrays of equal length" to mean "<i>lists</i> of equal length", then the task might look like this:
i.e. there are no "not hashed arrays". <br>
<lang tcl>set keys [list fred bob joe]
If we can take "arrays of equal length" to mean
"<i>lists</i> of equal length",
then the task might look like this:
<syntaxhighlight lang="tcl">set keys [list fred bob joe]
set values [list barber plumber tailor]
array set arr {}
foreach a $keys b $values { set arr($a) $b }</lang>
 
Alternatively, a dictionary could be used:
parray arr</syntaxhighlight>
<lang tcl>foreach a $keys b $values {
{{out}}
<pre>
arr(bob) = plumber
arr(fred) = barber
arr(joe) = tailor
</pre>
 
Alternatively, a dictionary could be used: <!-- http://ideone.com/6lI4k5 -->
<syntaxhighlight lang="tcl">package require Tcl 8.5
set keys [list fred bob joe]
set values [list barber plumber tailor]
foreach a $keys b $values {
dict set jobs $a $b
}
}</lang>
puts "jobs: [dict get $jobs]"</syntaxhighlight>
{{out}}
<pre>
jobs: fred barber bob plumber joe tailor
</pre>
 
=={{header|TXR}}==
 
===One-liner, using quasiquoted hash syntax===
<lang txr>@(do (defun hash-from-two (vec1 vec2 equal-based-p)
(let ((table (make-hash nil nil equal-based-p)))
(for ((i 0)) ((< i (length vec1)) table) ((inc i))
(set (gethash table (vecref vec1 i) 0)
(vecref vec2 i))))))
@(bind hash @(hash-from-two #(a b c) #(1 2 3) nil))
@(bind (keys vals) @(let (k v)
(dohash (key val hash (list k v))
(push key k)
(push val v))))</lang>
 
<syntaxhighlight lang="bash">$ txr -p '^#H(() ,*[zip #(a b c) #(1 2 3)])))'
<pre>$ ./txr rosetta/hash-from-two.txr
#H(() (c 3) (b 2) (a 1))</syntaxhighlight>
hash="#<hash: 175bc40>"
 
keys[0]="a"
===One-liner, using <code>hash-construct</code> function===
keys[1]="b"
 
keys[2]="c"
<syntaxhighlight lang="bash">$ txr -p '(hash-construct nil [zip #(a b c) #(1 2 3)])))'
vals[0]="1"
#H(() (c 3) (b 2) (a 1))</syntaxhighlight>
vals[1]="2"
 
vals[2]="3"</pre>
===Explicit construction and stuffing===
 
<syntaxhighlight lang="txrlisp">(defun hash-from-two (vec1 vec2 . hash-args)
(let ((table (hash . hash-args)))
(mapcar (do sethash table) vec1 vec2)
table))
 
(prinl (hash-from-two #(a b c) #(1 2 3)))</syntaxhighlight>
 
<pre>$ ./txr hash-from-two.tl
#H(() (c 3) (b 2) (a 1))</pre>
 
=={{header|UNIX Shell}}==
{{works with|Bash|4}}
<syntaxhighlight lang="bash">keys=( foo bar baz )
values=( 123 456 789 )
declare -A hash
 
for (( i = 0; i < ${#keys[@]}; i++ )); do
hash["${keys[i]}"]=${values[i]}
done
 
for key in "${!hash[@]}"; do
printf "%s => %s\n" "$key" "${hash[$key]}"
done</syntaxhighlight>
 
{{out}}
<pre>bar => 456
baz => 789
foo => 123</pre>
 
=={{header|UnixPipes}}==
Using a sorted file as an associative array (see Creating an associative array for usage.)
 
<langsyntaxhighlight lang="bash">cat <<VAL >p.values
apple
boy
Line 1,187 ⟶ 2,555:
KEYS
 
paste -d\ <(cat p.values | sort) <(cat p.keys | sort)</langsyntaxhighlight>
 
=={{header|Ursala}}==
There's is a built -in operator for this.
<langsyntaxhighlight Ursalalang="ursala">keys = <'foo','bar','baz'>
values = <12354,145430,76748>
 
hash_function = keys-$values</langsyntaxhighlight>
test program:
<langsyntaxhighlight Ursalalang="ursala">#cast %nL
 
test = hash_function* <'bar','baz','foo','bar'></langsyntaxhighlight>
{{out}}
output:
<pre><145430,76748,12354,145430></pre>
 
=={{header|Vala}}==
{{libheader|Gee}}
<langsyntaxhighlight lang="vala">
using Gee;
 
Line 1,220 ⟶ 2,588:
}
}
</syntaxhighlight>
</lang>
 
=={{header|VBScript}}==
Line 1,226 ⟶ 2,594:
VBScript (and Visual Basic in general) calls hashes "dictionary objects".
 
<langsyntaxhighlight lang="vb">Set dict = CreateObject("Scripting.Dictionary")
os = Array("Windows", "Linux", "MacOS")
owner = Array("Microsoft", "Linus Torvalds", "Apple")
Line 1,234 ⟶ 2,602:
MsgBox dict.Item("Linux")
MsgBox dict.Item("MacOS")
MsgBox dict.Item("Windows")</langsyntaxhighlight>
 
Output (in message boxes):
 
{{out}} (in message boxes):
Linus Torvalds
Apple
Line 1,245 ⟶ 2,612:
{{trans|VBScript}}
 
The [[Hash from two arrays#VBScript|VBScript]] version can be used in Visual Basic unchanged, although it requires a reference to the [[Windows Script Host|Microsoft Scripting Runtime (scrrun.dll)]].
in Visual Basic unchanged, although it requires a reference to
the [[Windows Script Host|Microsoft Scripting Runtime (scrrun.dll)]].
 
Alternately, instead of a <code>Dictionary</code> object,
Alternately, instead of a <code>Dictionary</code> object, you can also use a <code>Collection</code> object, which serves a similar purpose, without the inclusion of an additional runtime library. In fact, the only immediately-obvious difference between this and the VBScript example is <code>dict</code>'s data type, and the order that the arguments are passed to the <code>Add</code> method.
you can also use a <code>Collection</code> object,
which serves a similar purpose, without the inclusion
of an additional runtime library.
In fact, the only immediately-obvious difference between this
and the VBScript example is <code>dict</code>'s data type,
and the order that the arguments are passed to the <code>Add</code> method.
 
<langsyntaxhighlight lang="vb">Dim dict As New Collection
os = Array("Windows", "Linux", "MacOS")
owner = Array("Microsoft", "Linus Torvalds", "Apple")
Line 1,257 ⟶ 2,632:
Debug.Print dict.Item("Linux")
Debug.Print dict.Item("MacOS")
Debug.Print dict.Item("Windows")</langsyntaxhighlight>
 
=={{header|WDTE}}==
{{omit from|TI-83 BASIC}} {{omit from|TI-89 BASIC}} {{omit from|PowerBASIC}} {{omit from|BASIC}} <!-- Does not have hash tables or other map structures. -->
<syntaxhighlight lang="wdte">let a => import 'arrays';
let s => import 'stream';
 
let toScope keys vals =>
s.zip (a.stream keys) (a.stream vals)
->
s.reduce (collect (true)) (@ r scope kv =>
let [k v] => kv;
set scope k v;
)
;</syntaxhighlight>
 
'''Example:'''
 
<syntaxhighlight lang="wdte">toScope
['a'; 'b'; 'c']
[1; 2; 3]
: scope
-> known
-> a.stream
-> s.map (@ m k => [k; at scope k])
-> s.collect
-- io.writeln io.stdout
;</syntaxhighlight>
 
{{out}}
 
<pre>[[a; 1]; [b; 2]; [c; 3]]</pre>
 
=={{header|V (Vlang)}}==
<syntaxhighlight lang="v (vlang)">fn main() {
keys := ["a", "b", "c"]
vals := [1, 2, 3]
mut hash := map[string]int{}
for i, key in keys {
hash[key] = vals[i]
}
println(hash)
}</syntaxhighlight>
{{out}}
<pre>
{'a': 1, 'b': 2, 'c': 3}
</pre>
 
=={{header|Wortel}}==
Wortel has an inbuilt operator to do this: <code>@hash</code>.
<syntaxhighlight lang="wortel">@hash ["a" "b" "c"] [1 2 3] ; returns {a 1 b 2 c 3}</syntaxhighlight>
This function can also be defined as:
<syntaxhighlight lang="wortel">^(@obj @zip)</syntaxhighlight>
Example:
<syntaxhighlight lang="wortel">@let {
hash ^(@obj @zip)
!!hash ["a" "b" "c"] [1 2 3]
}</syntaxhighlight>
{{out|Returns}}
<pre>{a 1 b 2 c 3}</pre>
 
=={{header|Wren}}==
Wren's built-in Map class does not guarantee (as here) that iteration order will be the same as the order in which elements were added.
<syntaxhighlight lang="wren">var keys = [1, 2, 3, 4, 5]
var values = ["first", "second", "third", "fourth","fifth"]
var hash = {}
(0..4).each { |i| hash[keys[i]] = values[i] }
System.print(hash)</syntaxhighlight>
 
{{out}}
<pre>
{2: second, 1: first, 3: third, 5: fifth, 4: fourth}
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang "XPL0">func Code(Str); \Return a simple, perfect hash code for the Keys used here
char Str;
return Str(2) & 7;
 
int Keys, Values, I, Hash(8);
[Keys:= ["first", "second", "third", "fourth", "fifth", "sixth"];
Values:= [1, 2, 3, 4, 5, 6];
for I:= 0 to 6-1 do
Hash(Code(Keys(I))):= Values(I);
IntOut(0, Hash(Code("second"))); CrLf(0);
IntOut(0, Hash(Code("sixth"))); CrLf(0);
]</syntaxhighlight>
{{out}}
<pre>
2
6
</pre>
 
=={{header|Yabasic}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="vb">data "1", "one", "2", "two", "3", "three", "4", "four", "5", "five"
 
dim keys$(5), values$(5)
dim hash$(5)
 
for i = 1 to arraysize(keys$(), 1)
read a$, b$
keys$(i) = a$
values$(i) = b$
next i
 
for i = 1 to arraysize(values$(), 1)
temp = val(keys$(i))
hash$(temp) = values$(i)
next i
 
for i = 1 to arraysize(hash$(), 1)
print keys$(i), " ", hash$(i)
next i
end</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
=={{header|zkl}}==
<syntaxhighlight lang="zkl">keys:=T("a","b","c","d"); vals:=T(1,2,3,4);
d:=keys.zip(vals).toDictionary();
d.println();
d["b"].println();</syntaxhighlight>
{{out}}
<pre>D(a:1,b:2,c:3,d:4)
2
</pre>
890

edits