从Ruby中的Hash获取数字键

时间:2012-02-25 03:25:01

标签: ruby

说我有一个类似的哈希:

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

我如何确定此哈希是否包含任何数字键并拉出这些键的值?

4 个答案:

答案 0 :(得分:2)

试试这个:

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

请记住,我没有为您提取值,它只返回您所选标准的哈希值。像你习惯的那样将值拉出这个哈希值。

答案 1 :(得分:2)

另一种解决方案:

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

返回整数键的值(正数或负数)。

答案 2 :(得分:1)

如果“numeric”表示整数,则:

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

如果“numeric”还包括浮点值,则:

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

您可能希望调整正则表达式测试以允许前导和尾随空格(或不是)。

答案 3 :(得分: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?}