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

问题描述 投票:0回答:3

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

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

我有以下方法来计算数组中的最小数字

data.map(&:to_i).min

这非常有效,除了非整数字符串悄悄进入我的数组的时候,例如

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

使用我的

data.map(&:to_i).min
行,上面返回零。 如何修改我的代码,以便它只获取数组中实际上是整数的最小元素?

arrays ruby string integer min
3个回答
4
投票

您有几种方法可以做到这一点,但最简单的方法是如果您想忽略垃圾,则筛选出非数字值:

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

grep
方法可以很容易地挑选出与特定模式匹配的东西以及许多其他东西。


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
被返回,导致字符串未被选择。 (当然,人们可以多走一步,使用仅挽救
ArgumentError
例外情况的条款。)

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

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 

0
投票

使用 Enumerable#grep_v 我们可以执行以下操作并排除单词字符串:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.