0

有没有更干净的方法来写这个?我不喜欢代码重复。

# 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]

随意评论/批评并表达您的想象力!

谢谢。

4

4 回答 4

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

编辑:钋的建议更好。

于 2013-08-19T14:20:02.583 回答
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

在这种情况下,对数组大小的检查只进行一次。我介绍了这个新函数以确保它更具可读性。

于 2013-08-19T16:18:34.890 回答
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
于 2013-08-19T14:16:41.927 回答
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 否定是我努力的目标。

所有的样本数据都已经是整数了,但我把强制转换留给了整数。

于 2013-08-19T15:42:27.947 回答