Hash table

Hi all,

I am a newbie in Ruby, and I am having a small question with the hash
table. If anyone could give me some suggestions that would be great!

Considering creating a hash table like this:

a_Min a_Max b_Min b_Max p1 p2 p3
p4
p5 p6
40.000 47.95 -95.0 -74.01 12.8 6.5 177.82 0.9150 68.62
0.9020
42.000 47.95 -68.0 -59.50 11.0 5.8 185.20 0.9377 -11.80
0.9538
44.000 47.95 -74.2 -68.05 12.8 6.5 157.45 0.9194 37.55
0.9297
46.000 66.00 -59.5 -51.00 8.8 3.7 164.96 0.9465 -207.54
1.0342
47.951 66.00 -79.0 -59.55 12.8 6.5 157.45 0.9194 37.55
0.9297
47.951 66.00 -95.0 -79.01 12.8 6.5 177.82 0.9150 68.62
0.9020

If giving any (a,b), it will fall within the four boundary control
values
in the hash table (a_Min, a_Max, b_min, b_Max) and returns its relative
parameters (p1, p2, p3…)

I am trying something like this:

def functionXXX(a, b)
threshold = XXX # how to create
a
hash table with the above data?
for t in threshold do
if (t[:a_Min]<=a && a<t[:a_Max] && t[:b_Min]<=b && b<t[:b_Max]) then
#if there is a smarter way in Ruby for this?
return t
break
end
end
end

Would this be the correct way of doing this task in Ruby?

Thanks!

Suo

Looks to me like you will have an Array of hashes.

The ruby way something like a single line array select

t.select{|tt| a.between?(tt[:min], tt[:max]) && b.between?(tt[:b_min],
tt[:b_max])}

create the array initially with something like

t = Array.new
t << {a_min: 1, a_max:10, b_min: 100, b_max: 1000, p1: 1, p2: 2, p3: 3}
t << {a_min: 1, a_max:10, b_min: 100, b_max: 1000, p1: 1, p2: 2, p3: 3}

(fill in your data)

you could do t = [{your data}, {your hash data}….]

If you only want the first value in the array that matches, use t.detect
rather than t.select

It will return either any array of matching hashes or with detect the
first one…

Use the rails console to test all this stuff. rails c

t = Array.new

Use the rails console to test all this stuff. rails c

Or, use the fact that you have a well-defined range for the ‘a’ and ‘b’

TABLE = [
{a: 40.000…47.95, b: -95.0…-74.01, p1: 12.8, p2: 6.5, p3: 177.82,
p4: 0.9150, p5: 68.62, p6: 0.9020},
{a: 42.000…47.95, b: -68.0…-59.50, p1: 11.0, p2: 5.8, p3: 185.20,
p4: 0.9377, p5: -11.80, p6: 0.9538},
{a: 44.000…47.95, b: -74.2…-68.05, p1: 12.8, p2: 6.5, p3: 157.45,
p4: 0.9194, p5: 37.55, p6: 0.9297},
{a: 46.000…66.00, b: -59.5…-51.00, p1: 8.8, p2: 3.7, p3: 164.96,
p4: 0.9465, p5: -207.54, p6: 1.0342},
{a: 47.951…66.00, b: -79.0…-59.55, p1: 12.8, p2: 6.5, p3: 157.45,
p4: 0.9194, p5: 37.55, p6: 0.9297},
{a: 47.951…66.00, b: -95.0…-79.01, p1: 12.8, p2: 6.5, p3: 177.82,
p4: 0.9150, p5: 68.62, p6: 0.9020},
];
def params(a:, b:)
TABLE.detect {|h| h[:a].cover?(a) && h[:b].cover?(b) }
end

irb2.2.3> params(a: 45.2, b: -70)
#2.2.3 => {:a=>44.0…47.95, :b=>-74.2…-68.05, :p1=>12.8, :p2=>6.5,
:p3=>157.45, :p4=>0.9194, :p5=>37.55, :p6=>0.9297}

Obviously build your table as big as you need, but you might have to
think about a more suitable data structure if this crude linear search
through an array isn’t fast enough.

-Rob