我有以下代码:
[array1, array2, array3].transpose
我想做这样的事情:
[array1, array2, array3].transpose unless array2[value] == ""
我想转置每个数组,但是当被转置的array2
的值为空时,我想完全跳到下一组值,确保没有任何数组被转置。
我如何在Ruby 1.9.3中处理它?</ p>
答案 0 :(得分:3)
考虑一下:
arr1 = ["a", "b"]
arr2 = ["", "c"]
arr3 = ["d", "e"]
现在,根据您的要求,;你想要那些不存在arr2
空白值的转置数组。
使用#reject
执行此操作:
[arr1, arr2, arr3].transpose.reject{ |x| x[1].empty? }
这里,x[1]
对应于每个转置数组中的第二个元素;它来自arr2
;所以在这里,我们拒绝了""
中存在arr2
的所有情况。
希望有所帮助
答案 1 :(得分:1)
如果您有大型数组,并且内存是一个问题,您可以在转置数组之前减小数组的大小。那是直截了当的。这是一种方式(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()
。越简单越好。