Получить цифровые ключи от Hash в Ruby - PullRequest
0 голосов
/ 25 февраля 2012

Скажем, у меня есть хэш, как:

h = { '0' => 'foo', 'bar' => 'baz' => '2' => 'yada'  }

Как мне определить, есть ли в этом хеше числовые ключи, и извлечь значения этих ключей?

Ответы [ 4 ]

2 голосов
/ 25 февраля 2012

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

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

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

2 голосов
/ 25 февраля 2012

попробуйте это:

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

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

1 голос
/ 25 февраля 2012

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

    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 &lt&lt v if k.is_i?} 
1 голос
/ 25 февраля 2012

Если «число» означает целое число, то:

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"]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...