如何在字符串数组中找到最小元素,但只考虑整数?

时间:2017-01-17 23:46:53

标签: arrays ruby string integer min

我正在使用Ruby 2.4。我有一个字符串数组,应该是整数...

["1", "55", "25", ... ]

我有以下内容来确定数组中的最小数字

data.map(&:to_i).min

这非常有用,除非非整数字符串进入我的数组,例如

["1", "a", "2", "3"]

使用我的data.map(&:to_i).min行,上面的回报为零。如何修改我的代码,使它只占用数组中实际为整数的元素的最小值?

3 个答案:

答案 0 :(得分:4)

你有几种方法可以做到这一点,但最简单的方法是在你想忽略垃圾时筛选出非数值:

data = ["1", "a", "2", "3"]
data.grep(/\A\-?\d+\z/).map(&:to_i).min
# => 1

使用grep方法可以轻松挑选出与特定模式匹配的内容,以及许多其他内容。

答案 1 :(得分:3)

当我想将字符串转换为整数时,如果且只是整数的字符串表示,我总是使用Kernel::Integer

arr = ["3", "a", "2", "0x01", "0c", "0b11", "0o03", "4", "1_000"]

arr.select { |s| Integer(s) rescue nil }.min_by { |s| Integer(s) }
  #=> "0x01" 

下面

arr.select { |s| Integer(s) rescue nil }
  #=> ["3", "2", "0x01", "0b11", "0o03", "4", "1_000"] 

注意"0x01".to_i #=> 0(不是!),这就是Integer必须使用两次的原因。

如果字符串不是整数的表示,Integer会引发异常:

Integer("a") 
  #=> ArgumentError: invalid value for Integer(): "a"

在线获救,导致nil返回,导致未选择字符串。 (当然,人们可以加倍努力并使用只能解救ArguementError例外的条款。)

该问题要求返回数组(字符串)的元素。如果需要它的整数等价,你可以写:

a = arr.map { |s| Integer(s) rescue nil }.compact.min
  #=> 1

,其中

arr.map { |s| Integer(s) rescue nil }
  #=> [3, nil, 2, 1, nil, 3, 3, 4, 1_000]

请注意

['a', 'b'].map { |s| Integer(s) rescue nil }.compact.min
  #=> nil 

答案 2 :(得分:0)

使用Enumerable#grep_v我们可以执行以下操作并排除wordy-strings:

 arr = ["1", "a", "2", "3"]
 arr.grep_v(/[a-zA-Z]+/).min_by(&:to_i) #=> "1"

根据需要修改正则表达式。