【问题标题】:Why can't I change numbers as strings into integers?为什么我不能将数字作为字符串更改为整数?
【发布时间】:2016-07-12 01:47:24
【问题描述】:

我正在做一个 kata,需要我将两个数字字符串(例如,“1 2 3 4 5 6”)更改为整数,将这些整数相加,然后确定哪个值更大以打印出信息。 到目前为止,这是我所拥有的:

def goodVsEvil(good, evil)
 goodarr = []
 evilarr = []

 goodarr.push(good.split(" "))
 evilarr.push(evil.split(" "))

 goodarr.each{|n| n.to_i}
 evilarr.each{|n| n.to_i}

 goodsum = goodarr.inject(:+)
 evilsum = evilarr.inject(:+)

 if goodsum > evilsum
   return "Battle Result: Good triumphs over Evil"
 elsif goodsum < evilsum
   return "Battle Result: Evil eradicates all trace of Good"
 elsif goodsum = evilsum
   return "Battle Result: No victor on this battle field"
 end
end

我将字符串拆分为单独的数字并将它们推送到各自的数组中,但我需要将它们转换为整数,并且解释器不会将 .to_i 方法识别为有效方法。 我该如何解决或者我哪里错了?

【问题讨论】:

    标签: arrays ruby string integer


    【解决方案1】:

    这里至少有三个错误:

    goodarr.push(good.split(" "))
    

    这并不像你认为的那样。在这里,您只需将单个元素添加到数组中,即调用 split 的结果数组:

    goodarr => [["1", "2", "3", "4", "5", "6"]]
    

    这意味着数组中的每个元素都是一个数组,没有to_i方法。

    你应该这样做:

    goodarr = good.split(" ")
    

    goodarr = good.split # use spaces by default
    

    第二个错误是这样的:

    goodarr.each{|n| n.to_i}
    

    这段代码完全没有副作用。块返回的值不存储在任何地方。您需要改用map!

    goodarr.map!{|n| n.to_i}
    

    最后一个错误是使用赋值运算符 = 时,您实际上想使用相等运算符 == 比较值是否相等。

    【讨论】:

    • 最后注意最后一个条件是使用赋值=而不是相等==
    • 可能与问题无关,但实现相同目的的另一种方法是使用正则表达式。例如:good_sum = good.scan(/\d+/).collect(&:to_i).sum
    • @nkm 我的想法也是以不同的方式获得总和:good_sum = eval(good.gsub(" ","+")) 也可以。
    • @nkm sumrails 未在 ruby​​ 核心中实现的方法。您需要使用injectreduce。例如,我会将您的方法更改为good.scan(/\d+/).map(&amp;:to_i).reduce(:+)
    • 如果你认为只有两个错误,你就不算数了:)
    【解决方案2】:

    首先split 返回一个数组。您不需要一开始就创建它。 each 仅遍历数组,但不会更改其元素。因此您可以使用map

    def goodVsEvil(good, evil)
      goodarr = good.split(" ").map{|n| n.to_i}
      evilarr = evil.split(" ").map{|n| n.to_i}
    
      goodsum = goodarr.inject(:+)
      evilsum = evilarr.inject(:+)
    
      if goodsum > evilsum
        return "Battle Result: Good triumphs over Evil"
      elsif goodsum < evilsum
        return "Battle Result: Evil eradicates all trace of Good"
      elsif goodsum = evilsum
        return "Battle Result: No victor on this battle field"
      end
    end
    
    goodVsEvil("1 2 3 4 5 6", "1 2 3 4 5 6 7")
    # => "Battle Result: Evil eradicates all trace of Good"
    

    你试过了:

    goodarr = []
    goodarr.push(good.split(" "))
    # => [["1", "2", "3", "4", "5", "6"]]
    

    如您所见,这会产生一个嵌套数组。

    【讨论】:

      【解决方案3】:

      让我们分解一下:

      def goodVsEvil(good, evil)
       goodarr = []
       evilarr = []
      

      真的没有必要“声明”你的变量。

       goodarr.push(good.split(" "))
       evilarr.push(evil.split(" "))
      

      你在这里将一个数组推入一个数组,所以你最终得到一个单元素数组,单个元素是一个多元素数组。基本上是这样的:

      “1 2 3 4 5 6”变成[[1,2,3,4,5,6]],这不是你想要的。直接赋值evilarr=evil.split(" ")就是你想要的。

       goodarr.each{|n| n.to_i}
       evilarr.each{|n| n.to_i}
      

      这些行什么都不做。这不会影响每个数组。

       goodsum = goodarr.inject(:+)
       evilsum = evilarr.inject(:+)
      

      所有这些问题最终都无法正常工作。

       if goodsum > evilsum
         return "Battle Result: Good triumphs over Evil"
       elsif goodsum < evilsum
         return "Battle Result: Evil eradicates all trace of Good"
       elsif goodsum = evilsum
         return "Battle Result: No victor on this battle field"
       end
      end
      

      goodsum = evilsum 外,此代码均有效。一个“=”是赋值,“==”是比较。

      我会这样做:

      def goodVsEvil(good,evil)
        goodsum = good.split(/\s+/).map(&:to_i).inject(0, :+)
        evilsum = evil.split(/\s+/).map(&:to_i).inject(0, :+)
      
        if goodsum > evilsum
          return "Battle Result: Good triumphs over Evil"
        elsif goodsum < evilsum
          return "Battle Result: Evil eradicates all trace of Good"
        elsif goodsum == evilsum
          return "Battle Result: No victor on this battle field"
        end
      end
      

      分解:

      1. good.split(/\s+/) - 使用正则表达式拆分字符串使其接受更脏的输入。
      2. .map(&amp;:to_i) - 这将获取上一步的字符串数组,在每个字符串上调用“to_i”方法来创建一个整数,然后返回整数数组。
      3. .inject(0, :+) - 这需要整数数组,从 0 开始,然后将每个整数相加,然后返回总和。

      【讨论】:

      • 万岁指出if..elsif条件句中的分配问题。
      • 如果你要做代码审查,不妨全力以赴。
      猜你喜欢
      • 2016-08-18
      • 2021-05-09
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      相关资源
      最近更新 更多