Hi Im new to Ruby and am getting some unexpected results from a
dynamically created Hash. The following from irb is my attempt to
troubleshoot why its not working.
irb(main):028:0> x = Hash.new
=> {}
Dynamically build the hash, works.
irb(main):029:0> (1…49).each { |y| x[y] = y-2 }
=> 1…49
irb(main):030:0> x
=> {1=>-1, 2=>0, 3=>1, 4=>2, 5=>3, 6=>4, 7=>5, 8=>6, 9=>7, 10=>8, 11=>9,
12=>10, 13=>11, 14=>12, 15=>13, 16=>14, 17=>15, 18=>16, 19=>17, 20=>18,
21=>19, 22=>20, 23=>21, 24=>22, 25=>23, 26=>24, 27=>25, 28=>26, 29=>27,
30=>28, 31=>29, 32=>30, 33=>31, 34=>32, 35=>33, 36=>34, 37=>35, 38=>36,
39=>37, 40=>38, 41=>39, 42=>40, 43=>41, 44=>42, 45=>43, 46=>44, 47=>45,
48=>46, 49=>47}
Gives the result I expect
irb(main):031:0> x[46]
=> 44
Sort by the value…
irb(main):032:0> x = x.sort_by {|k,v| v}.reverse
=> [[49, 47], [48, 46], [47, 45], [46, 44], [45, 43], [44, 42], [43,
41], [42, 40], [41, 39], [40, 38], [39, 37], [38, 36], [37, 35], [36,
34], [35, 33], [34, 32], [33, 31], [32, 30], [31, 29], [30, 28], [29,
27], [28, 26], [27, 25], [26, 24], [25, 23], [24, 22], [23, 21], [22,
20], [21, 19], [20, 18], [19, 17], [18, 16], [17, 15], [16, 14], [15,
13], [14, 12], [13, 11], [12, 10], [11, 9], [10, 8], [9, 7], [8, 6], [7,
5], [6, 4], [5, 3], [4, 2], [3, 1], [2, 0], [1, -1]]
And here is the problem! Now that I am looking at it here, it’s
obvious that the sort is flattening the Hash… Is there a way to
restore it to a Hash, or a better way to achieve the sort?
irb(main):033:0> x[46]
=> [3, 1]
I’m sure I’m over looking something simple. Please help, I need the
sorted Hash to give me the appropriate value for the Integer key…