Вы можете просто использовать group_by
со значением:
>> states_with_depths.group_by { |k,v| v }
#=> {0=>[["S0", 0]], 1=>[["S1", 1]], 2=>[["S2", 2], ["S3", 2], ["S4", 2]], 3=>[["S5", 3]]}
Это также можно сократить до:
states_with_depths.group_by(&:last)
Чтобы использовать это, вы можете сделать что-то вроде:
states_with_depths.group_by(&:last).each do |depth, arrs|
puts "Values with depth #{depth}: #{arrs.map(&:first)}"
end
Какие выходы:
Values with depth 0: ["S0"]
Values with depth 1: ["S1"]
Values with depth 2: ["S2", "S3", "S4"]
Values with depth 3: ["S5"]