Xitcod13
Xitcod13

Reputation: 6079

How to get the first key and value pair from a hash table in Ruby

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.

Upvotes: 76

Views: 123860

Answers (4)

Praveen kumar
Praveen kumar

Reputation: 41

my_hash = { "a" => "first", "b" => "second" }

{ my_hash.keys.first => my_hash.values.first }

This works too

Upvotes: 4

Asef90
Asef90

Reputation: 71

[hash.first].to_h

Another way to do it.

Upvotes: 7

magicgregz
magicgregz

Reputation: 7669

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}

Upvotes: 50

pguardiario
pguardiario

Reputation: 54984

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}

Upvotes: 196

Related Questions