2012-07-23 59 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方法返回的值作爲一個整數