1

我有一个红宝石问题

这就是我想要做的

def iterate1               #define method in given class
 @var3 = @var2.split(" ")  #split string to array
 @var4 = @var3

 @var4.each do |i|         #for each array item do i
   ra = []
   i.each_char {|d|  ra << counter1(d)}  # for each char in i, apply def counter1

   @sum = ra.inject(:+)                  

   @sum2 = @sum.inject(:+)               #have to do the inject twice to get values

 end

@sum2

我知道我已经把这复杂化了

基本上输入是一串字母和值,例如“14556 this word 398”

我正在尝试对每个值中的数字求和,由空格分隔,例如 (" ")

当我使用 def iterate1 方法时,块调用 counter1 方法就好了,但我只能获取字符串中最后一个单词或值的值。

在本例中为 398,加起来为 27。

如果我包含一个中断,我会得到第一个值,即 21。

我正在寻找一个包含所有求和值的数组

任何帮助将不胜感激

4

2 回答 2

2

我想你在追求:

"10 d 20 c".scan(/\b\d+\b/).map(&:to_i).inject(:+) # Returns 30

scan(/\b\d+\b/)将提取仅由数组中的数字组成的所有数字,map(&:to_i)将它们转换为整数,我猜你已经知道该怎么inject(:+)做了。

不过,我不确定我是否正确理解了您所追求的内容,因此如果您提供您对此输入的期望答案可能会有所帮助。

编辑:

如果你想对每个数字中的数字求和,你可以这样做:

"12 d 34 c".scan(/\b\d+\b/).map { |x| x.chars.map(&:to_i).inject(:+) }

x.chars将返回数字的枚举器,map(&:to_i)将它们转换为整数并将它们inject(:+)相加。

于 2012-07-23T12:52:01.253 回答
0

最简单的答案是使用map而不是each因为前者收集结果并返回一个数组。例如:

def iterate1               #define method in given class
 @var3 = @var2.split(" ")  #split string to array
 @var4 = @var3

 @var4.map do |i|         #for each array item do i
   ra = []
   i.each_char {|d|  ra << counter1(d)}  # for each char in i, apply def counter1

   @sum = ra.inject(:+)                  
   @sum2 = @sum.inject(:+)               #have to do the inject twice to get values
 end
end

不过你可以写得更干净,我认为 Stefan 帮了大忙。你可以通过稍微修改他的代码来解决这个问题

# when you call iterate, you should pass in the value
# even if you have an instance variable available (e.g. @var2)
def iterate(thing)
  thing.scan(/\b\d+\b/).map do |x| 
    x.chars.map{|d| counter1(d)}.inject(:+)
  end
end

以上假设该counter1方法将值作为整数返回

于 2012-07-24T05:01:54.503 回答