ruby字符串数组迭代。数组数组

时间:2012-07-23 12:48:10

标签: ruby arrays multidimensional-array loops

我有红宝石问题

这是我正在尝试做的事情

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。

我希望输出一个包含所有求和值的数组

非常感谢任何帮助

2 个答案:

答案 0 :(得分: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(:+)会将它们相加。

答案 1 :(得分:0)

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

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方法将值返回为整数