2012-07-23 55 views
1

我有一个红宝石问题ruby​​字符串数组迭代。数组的数组

这里就是我想要做

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这个词398”

我想在每个值求和的数字,由像(”“)

空格分隔10

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

在这种情况下,这是398,当其总结会27

如果我有一个突破,我得到的第一个值,这将是21

我期待与输出数组所有的汇总值

任何帮助,将不胜感激

+0

我建议所有这些实例变量转换为本地变量和重命名他们适当的第一。 – 2012-07-23 13:20:26

回答

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(:+)会将它们相加。

+0

即时寻找每个值是一个单独的数组项目,像[27,21]等 – 2012-07-23 12:57:03

+0

我已经回复了一个编辑。 – 2012-07-23 12:59:04

+0

我在哪里可以打电话给我的counter1方法。我需要在每个值 – 2012-07-23 13:04:41

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 

虽然你可以写很多清洁,但我认为斯蒂芬是一个很大的帮助。你可以解决这个问题与他的代码稍加修改

# 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方法返回的值作为一个整数