0

我有以下代码:

[array1, array2, array3].transpose

我想做这样的事情:

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

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

我如何在 Ruby 1.9.3 中处理它?

4

2 回答 2

3

考虑一下:

arr1 = ["a", "b"]
arr2 = ["",  "c"]
arr3 = ["d", "e"]

现在,根据您的要求,;arr2 你想要那些不存在空白值的转置数组。

用作#reject

[arr1, arr2, arr3].transpose.reject{ |x| x[1].empty? }

这里,x[1]对应于每个转置数组中的第二个元素;它来自arr2;所以在这里,我们拒绝了所有""出现在arr2.

希望能帮助到你

于 2013-10-22T18:04:36.850 回答
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()。越简单越好。

于 2013-10-22T23:02:23.780 回答