I'm trying to get the first key and value key from a hash table in ruby. I don't know the key values of the hash because it is passed to the method. I cant find anywhere online how to find the first key/value as a separate hash table. I think hash[0]
will just try to find an element with a name 0 it just returns nil
when I run the code.
I know I can find the key name and the value and then create a new hash from them but i wonder if there is an easier way to do this so I get a hash right away.
here is my code:
def rps_game_winner(game) rock_in_hash = game.invert['R'] paper_in_hash = game.invert['P'] scissors_in_hash = game.invert['S'] if(rock_in_hash) if(paper_in_hash) return paper_in_hash; elsif(scissors_in_hash) return rock_in_hash end elsif(paper_in_hash) if(rock_in_hash) return paper_in_hash elsif(scissors_in_hash) return scissors_in_hash end end key = game.keys[-1] value = game.values[-1] winner = {key => value} return winner end game_one = { "Bob" => 'P', "Jim" => 'P' } puts rps_game_winner(game_one)
This gets me the correct result the problem is I don't understand why it's -1 instead of zero... And i was hoping there was a better way to get the first key/value pair of a hash table instead of creating new hash table with the key and value you retrieved from the previous table.
hash.fetch(key) { | key | block } Returns a value from hash for the given key. If the key can't be found, and there are no other arguments, it raises an IndexError exception; if default is given, it is returned; if the optional block is specified, its result is returned.
Overview. We can check if a particular hash contains a particular key by using the method has_key?(key) . It returns true or false depending on whether the key exists in the hash or not.
Hash literals use the curly braces instead of square brackets and the key value pairs are joined by =>. For example, a hash with a single key/value pair of Bob/84 would look like this: { "Bob" => 84 }. Additional key/value pairs can be added to the hash literal by separating them with commas.
You can just do
key, value = hash.first
or if you prefer:
key = hash.keys[0] value = hash.values[0]
Then maybe:
new_hash = {key => value}
There is a shorter answer that does not require you to use extra variables:
h = { "a" => 100, "b" => 200 , "c" => 300, "d" => 400, "e" => 500} Hash[*h.first] #=> {"a" => 100}
Or if you want to retrieve a key/value at a any single position
Hash[*h.to_a.at(1)] #=> {"b" => 200}
Or retrieve a key/values from a range of positions:
Hash[h.to_a[1,3]] #=> {"b"=>200, "c"=>300, "d"=>400}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With