【问题标题】:How do I find the minimum element in an array of strings, but only considering integers?如何在字符串数组中找到最小元素,但只考虑整数?
【发布时间】:2017-06-02 05:17:09
【问题描述】:

我使用的是 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


    【解决方案1】:

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

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

    grep 方法可以很容易地挑选出符合特定模式的事物以及许多其他事物。

    【讨论】:

    • @steenslag 目前尚不清楚这些数据是否只是积极的,但无论如何我添加了一个可选的-
    【解决方案2】:

    当我想将字符串转换为整数时,当且仅它是整数的字符串表示时,我总是使用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 
    

    【讨论】:

      【解决方案3】:

      使用Enumerable#grep_v,我们可以执行以下操作并排除冗长的字符串:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-22
        • 2014-11-28
        • 1970-01-01
        • 2019-08-31
        • 2017-10-25
        • 2017-05-31
        • 1970-01-01
        相关资源
        最近更新 更多