除非数组元素为空,否则如何转置多个数组?

时间:2013-10-22 17:28:52

标签: ruby arrays transpose

我有以下代码:

[array1, array2, array3].transpose

我想做这样的事情:

[array1, array2, array3].transpose unless array2[value] == ""

我想转置每个数组,但是当被转置的array2的值为空时,我想完全跳到下一组值,确保没有任何数组被转置。

我如何在Ruby 1.9.3中处理它?<​​/ p>

2 个答案:

答案 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,其中包含要跳过的列的索引。
  • 从每行中删除bad_cols列,然后应用转置。

编辑:已更换

bad_cols = arr[i].each_with_index.reduce([]) {|a,e| a << e.last if e.first==bad_obj; a}

前两行def tr()。越简单越好。