2012-02-25 6 views

ответ

2

попробовать это:

h.select {|key| [*0..9].map(&:to_s).include? key } 

помню, что я не вытащил значение для вас, он просто возвращает выбор вашей хэш с требуемыми критериями. Вытягивание значений из этого хэша, как вы привыкли.

1

Если "числовые" означает целое число, то:

a = h.each_with_object([]) { |(k, v), a| a << v if(k.to_i.to_s == k) } 

Если "числового" также включает в себя значение с плавающей точкой, то:

h.each_with_object([]) { |(k, v), a| a << v if(k =~ /\A[+-]?\d+(\.\d+)?\z/) } 

Например:

>> h = { '0' => 'foo', 'bar' => 'baz', '2' => 'yada', '-3.1415927' => 'pancakes' } 
=> {"0"=>"foo", "bar"=>"baz", "2"=>"yada", "-3.1415927"=>"pancakes"} 
>> h.each_with_object([]) { |(k, v), a| a << v if(k =~ /\A[+-]?\d+(\.\d+)?\z/) } 
=> ["foo", "yada", "pancakes"] 

Вы можете для корректировки теста регулярных выражений, чтобы разрешить прокручивание пробелов (или нет).

1

Или для, возможно, немного более читаемых, но более решений, попробуйте:

 
    class String 
     def is_i? 
     # Returns false if the character is not an integer 
     each_char {|c| return false unless /[\d.-]/ =~ c} 
     # If we got here, it must be an integer 
     true 
     end 
    end 
    h = {"42"=>"mary", "foo"=>"had a", "0"=>"little", "-3"=>"integer"} 
    result = [] 
    h.each {|k, v| result << v if k.is_i?} 
2

Другим решение:

h.select {|k,v| k.to_i.to_s == k}.values 

Это возвращает значения для ключей, которые являются целыми числами (положительными или отрицательными).

Смежные вопросы