我有以下代码:
[array1, array2, array3].transpose
我想做这样的事情:
[array1, array2, array3].transpose unless array2[value] == ""
我想转置每个数组,但是当值array2
被转置的值为空白时,我想完全跳到下一组值,确保没有任何数组被转置。
我如何在 Ruby 1.9.3 中处理它?
考虑一下:
arr1 = ["a", "b"]
arr2 = ["", "c"]
arr3 = ["d", "e"]
现在,根据您的要求,;arr2
你想要那些不存在空白值的转置数组。
用作#reject
:
[arr1, arr2, arr3].transpose.reject{ |x| x[1].empty? }
这里,x[1]
对应于每个转置数组中的第二个元素;它来自arr2
;所以在这里,我们拒绝了所有""
出现在arr2
.
希望能帮助到你
如果您有大型数组,并且内存是一个问题,您可以在转置之前减小数组的大小。这很简单。这是一种方式(i
作为包含一个或多个实例的行bad_obj
):
def tr(arr, i, bad_obj)
bad_cols = []
arr[i].each_with_index {|e,i| bad_cols << i if e==bad_obj}
arr.map {|row| row.reject.with_index {|e,i| bad_cols.include?(i)}}.transpose
end
arr = [[1,2,3], [4,'',6], [7,8,9]]
tr(arr, 1, "") # => [[1,4,7], [3,6,9]]
编辑:替换
bad_cols = arr[i].each_with_index.reduce([]) {|a,e| a << e.last if e.first==bad_obj; a}
与 的前两行def tr()
。越简单越好。