Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Re: Setting In-between values in a hash (interpolating)

by dreadpiratepeter (Priest)
on Sep 26, 2008 at 21:01 UTC ( [id://713943]=note: print w/replies, xml ) Need Help??


in reply to Setting In-between values in a hash (interpolating)

off the top of my head:
my %hash = (-5189 => 63, -3213 => 9, -2357 => 3); sub next_key { my ($h,$key) = @_; foreach my $hkey (sort keys %$h) { return $h->{$hkey} if $hkey >= $key; } return; } print next_key(\%hash,3000) . "\n";
but it returns null for 3000, because I believe your data is wrong. You imply that the keys should be positive. Try:
my %hash = (5189 => 63, 3213 => 9, 2357 => 3);


-pete
"Worry is like a rocking chair. It gives you something to do, but it doesn't get you anywhere."

Replies are listed 'Best First'.
Re^2: Setting In-between values in a hash (interpolating)
by ikegami (Patriarch) on Sep 26, 2008 at 21:13 UTC
    No need to sort
    sub next_key { my ($h, $key) = @_; my $best; foreach my $hkey (keys %$h) { if ( $hkey >= $key ) { if ( !defined($best) || $hkey < $best ) { $best = $hkey; } } } return $best; }
Re^2: Setting In-between values in a hash (interpolating)
by TGI (Parson) on Sep 26, 2008 at 21:45 UTC

    If you use one of the many ordered hash implementations out there (Tie::IxHash, Tie::Hash::Indexed, Tie::Hash::Sorted, etc.) your code gets even simpler.

    Untested example:

    use Tie::Hash::Sorted; my %hash = ( 5189 => 63, 3213 => 9, 2357 => 3, ); tie my %sorted_hash, 'Tie::Hash::Sorted', Hash => \%ages, Sort_Routine => sub { $a <=> $b }, ); sub next_key { my ($h,$key) = @_; foreach my $hkey (keys %$h) { return $h->{$hkey} if $hkey >= $key; } return; } print next_key(\%hash,3000) . "\n";

    You should be able to make a tied array.

    A rough outline:

    • Store your data in a hash, with keys as above.
    • Keep an array of sorted keys.
    • Your FETCH method will do lookups using a method like the above or even a binary search of your array of keys.
    • Your STORE method will add an item to the hash, and resort the array.
    • POP and SHIFT should remove and return the highest/lowest elements in the array.
    • Not sure about UNSHIFT or PUSH. Should clearly define all the normal hash behavior.

    Anyhow, this seems like a job for a tied array to me. Yeah you've got to do a lot of crud in the background to make it work, but once you are done, it becomes so easy to use.

    tie my @numbers, 'Tie::Array::NextIndex', Members => { 5189 => 63, 2357 => 3, }; my $value = $numbers[3000]; # value = 63 $numbers[3213] = 9; $value = $numbers[3000]; # value = 9


    TGI says moo

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://713943]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (2)
As of 2024-04-20 03:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found