|
hash |
Here we see how to create a class supporting array-like indexing. This is obtained overloading indexing operators trough _getitem and _setitem methods.
package hash; // Let's create a package
import basic; // Import some basic functions and classes
public class Hash extends basic.Object {
/*
* Hash table implementation
*
* There is a list of buckets. Every bucket has a list of
* pairs (key, value) with the same hash value.
*/
local bucket;
static nbuckets = 1039;
// Initialization method.
// Automatically called.
method init( ) {
bucket = #[ ]; // An empty array
}
// Getter method for indexing by [key]:
// object[key]
method _getitem( key ) {
local hv;
local pair;
hv = basic.hash( key ) % nbuckets;
if (hv < basic.length( bucket ))
{
for (pair in bucket[hv])
if (pair[0] == key) return pair[1];
}
throw [basic.IndexError new "key " +
basic.repr( key ) +
" not found", key, self];
}
// Setter method for indexing by [key]:
// object[key] = val
method _setitem( key, val ) {
local hv;
local pair;
hv = basic.hash( key ) % nbuckets;
if (hv >= basic.length( bucket ))
{
bucket[hv] = #[ #[ key, val ] ];
return self;
}
for (pair in bucket[hv])
{
for (pair in bucket[hv])
if (pair[0] == key) {
pair[1] = val;
return self;
}
local l = basic.length( bucket[hv] );
bucket[hv][l] = #[ key, val ];
return self;
}
}
// A method giving all keys (returned as an array)
method keys( ) {
local keys = #[ ];
local b, pair;
for (b in bucket)
{
for (pair in b)
keys[basic.length(keys)] = pair[0];
}
return keys;
}
}
// Here we start to execute package code
private ht = [Hash new];
ht["Hello"] = "World"; // Map a string to a string
ht["Larry"] = "Wall";
ht[12.6] = #[ 8, "Goofy", 4.4 ]; // Map a float to an array
ht["Dennis"] = "Ritchie";
try {
basic.print( ht["Dennis"], '\n' );
// Let's use a wrong index ! ...
basic.print( ht["Lorry"], '\n' );
} catch (basic.IndexError e) {
// ... and intercept it
basic.print( "Exception: ", [e getMessage], '\n' );
basic.print( " index: ", [e getIndex], '\n' );
}
// Print all pairs (key, value)
private k;
for (k in [ht keys])
basic.print( k, " -> ", ht[k], '\n' );