2013-08-19 124 views
0

有沒有更清晰的方式來寫這個?我不喜歡那個代碼重複。刪除ruby中的代碼重複

# Adds the content of two arrays except the first cell because the first cell is a string 
# The arrays don't have to be the same length. 
# * *Args* : 
# - +a+ -> first array 
# - +b+ -> second array 
# 
def add_array(a,b) 
    if a.size >= b.size then 
    a.map.with_index{ |m,i|if i != 0 then m + b[i].to_i else m end} 
    else 
    b.map.with_index{ |m,i|if i != 0 then m + a[i].to_i else m end} 
    end 
end 

輸入例:

arr1 = ["foo",1,2,3,4,5] 
arr2 = [] 
arr3 = ["foo",2,4,6,5,7,8,9,4,5,6] 


arr2 = add_array(arr1, arr2) 
puts arr2.inspect 
arr2 = add_array(arr2, arr3) 
puts arr2.inspect 

輸出:

["foo", 1, 2 ,3 ,4 ,5] 
["foo", 3, 6, 9, 9, 12, 8, 9, 4, 5, 6] 

隨意評論/批評,表達你的想象!

謝謝。

+1

給出一個示例輸入和輸出,可能是我們可以給出比你更好的代碼.. –

+0

@Babai例子添加。 – Pol0nium

回答

1

第一步:

def add_array(a,b) 
    if a.size > b.size then 
    a.map.with_index{ |m, i| if i != 0 then m + b[i].to_i else m end} 
    else 
    add_array(b, a) 
    end 
end 
+0

是的,很明顯,但我沒有考慮它。謝謝。 – Pol0nium

2

隨着愚見新手意見;

def add_array(a,b) 
    a, b = b, a if b.size > a.size 
    a.map.with_index{ |m,i|if i != 0 then m + b[i].to_i else m end} 
end 

編輯:Pol的建議是更好的。

+0

我總是被告知三元條件是一個壞習慣,因爲他們很難理解某個沒有編寫代碼並且不得不對其進行修改的人。你怎麼看? (無論如何,我喜歡你的解決方案;)) – Pol0nium

+1

我不認爲他們總是不好,但在這裏你可以交換這樣的行:a,b = b,a如果b.size> a.size – iCanLearn

+0

謝謝分享你的意見 – Pol0nium

1
def add_array(a,b) 
    a.map.with_index { |m, i| i.zero? && m || m + choose(a, b)[i].to_i } 
end 

def choose(a, b) 
    if a.size > b.size 
    b 
    else 
    a 
    end 
end 

根據大小拉取數組的順序意味着您可以在其他地方使用它。

去除if消極是我努力的方向。

所有的樣本數據都是整數,但我把強制轉化爲整數。

1
def add_array(a,b) 
    a.size > b.size ? merge_arrays(a,b) : merge_arrays(b,a) 
end 

def merge_arrays(a,b) 
a.map.with_index{ |m,i|if i != 0 then m + b[i].to_i else m end} 
end 

在這種情況下,數組大小的檢查只進行一次。我介紹了這個新功能,以確保它更具可讀性。