在Ruby中我会有这个数组数组:
[[1,1,1,0,0],[1,1,1,0,0],[0,0,0,1,1]]
转换为此矩阵或表(无标题):
11100
11100
00011
我想要做的是将数组中每个数组的每个元素转换为数组,例如,在上面的表/数组中,我将此输出作为数组数组:
[[1,1,0],[1,1,0],[1,1,0],[0,0,1],[0,0,1]]
或此表
110
110
110
001
001
最后,一旦完成上述操作,我想将数组中的每个数组转换为一个字符串,该字符串将排除任何不连续1的值,例如,如果我转换数组[1,0,1, 1,1,0,1]到一个非连续1被排除的字符串我应该得到这样的结果:111。注意第一,第二,第六和第七个元素被排除,因为它们不是连续的1。
答案 0 :(得分:2)
对于第一部分,您只需要Array#transpose
。
array.transpose
#=> [[1,1,0],[1,1,0],[1,1,0],[0,0,1],[0,0,1]]
然后你可以做以下
.map {|arr| arr.join.scan(/11+/)}
计算连续的数。 join
将每个子数组转换为字符串,然后scan
检查两个或更多个连续的1
。
共:
array.transpose.map {|arr| arr.join.scan(/11+/)}
#=> [["11"], ["11"], ["11"], [], []]
如果你想删除空数组,@ Doorknob注意到你可以追加reject
:
array.transpose.map {|arr| arr.join.scan(/11+/)}.reject(&:empty?)
#=> [["11"], ["11"], ["11"]]
答案 1 :(得分:0)
您也可以使用Enumerable#chunk:
<强>代码强>
array.transpose
.map { |a|
a.chunk { |e| e }
.select { |f,a| f == 1 && a.size > 1 }
.map { |_,a| a.join } }
示例强>
array = [[1,1,1,0,0],[1,1,0,1,0],[0,0,1,1,1],[1,1,0,1,1],[1,0,1,1,1]]
#=> [["11", "11"], ["11"], [], ["1111"], ["111"]]
如果需要,可以消除空集。
<强>解释强>
对于上面的array
,
a = array.transpose
#=> [[1, 1, 0, 1, 1],
# [1, 1, 0, 1, 0],
# [1, 0, 1, 0, 1],
# [0, 1, 1, 1, 1],
# [0, 0, 1, 1, 1]]
a.map
遍历a
的元素(行)。考虑第一个元素:
b = a.first
#=> [1, 1, 0, 1, 1]
c = b.chunk { |e| e }
#=> #<Enumerator: #<Enumerator::Generator:0x000001020495e0>:each>
要查看此枚举器的内容,请添加.to_a
b.chunk { |e| e }.to_a
#=> [[1, [1, 1]], [0, [0]], [1, [1, 1]]]
d = c.select { |f,a| f == 1 && a.size > 1 }
#=> [[1, [1, 1]], [1, [1, 1]]]
d.map { |_,a| a.join }
#=> ["11", "11"]