鉴于
arr = [5,6,7]
aa = [1,2,3,arr,8,9]
我希望生成数组
b = [[1,2,3,5,8,9], [1,2,3,6,8,9], [1,2,3,7,8,9]]
请注意,b
的所有三个元素都以aa
之前arr
的元素("初学者")开头,并以{{aa
元素结尾跟随arr
(" enders)的1}}。然后,i
的{{1}}元素被插入到arr
的{{1}}元素中,位于"初学者"之间。以及" enders"。因此,i
的大小等于b
的大小。
更一般地说,b
之前或之后arr
的元素可以是除数组之外的任何对象(不一定是整数)。
注意:此问题的原始陈述
aa
目的是产生数组
arr
这就是为什么有些答案没有反映上面修改过的例子。
答案 0 :(得分:2)
▶ max_sz = aa.map { |e| [*e].size }.max
#⇒ 3
▶ aa.map { |e| e.is_a?(Array) ? e : [e] * max_sz }.transpose
#⇒ [[1,2,3,5,8],[1,2,3,6,8],[1,2,3,7,8]]
或者,可能更清楚:
▶ aa.map { |e| ([*e] * max_sz).take(max_sz) }.transpose
答案 1 :(得分:1)
试试这个:
nested = aa.select { |ele| ele.is_a? Array }.flatten
aa = aa.select { |ele| !ele.is_a? Array }
result = []
nested.each { |ele| result << ([aa + [ele]].flatten.sort) }
答案 2 :(得分:0)
也许你可以使用这样的东西:
arr = [1, 2, 3, [5, 6, 7], 8]
# get fixnum
numbers = arr.select { |i| !(Array === i) }
output = arr.each.with_index.with_object(Array.new([])) do |(a, i), exp|
a.each { |k| exp << numbers.dup.insert(i, k) } if Array === a
end
p output
# => [[1, 2, 3, 5, 8], [1, 2, 3, 6, 8], [1, 2, 3, 7, 8]]
答案 3 :(得分:0)
first, mid, last = aa.chunk(&:class).map { |_,e| e.flatten }
#=> [[1, 2, 3], [5, 6, 7], [8]]
[first].product(mid.product([last])).map(&:flatten)
#=> [[1, 2, 3, 5, 8], [1, 2, 3, 6, 8], [1, 2, 3, 7, 8]]
步骤如下
enum = aa.chunk(&:class)
#=> #<Enumerator: #<Enumerator::Generator:0x007ff64a1699f8>:each>
我们可以看到这个枚举器通过将它转换为数组而生成的元素。
enum.to_a
#=> [[Fixnum, [1, 2, 3]], [Array, [[5, 6, 7]]], [Fixnum, [8]]]
继续,
first, mid, last = enum.map { |_,e| e.flatten }
#=> [[1, 2, 3], [5, 6, 7], [8]]
first
#=> [1, 2, 3]
mid
#=> [5, 6, 7]
last
#=> [8]
a = mid.product([last])
#=> [[5, [8]], [6, [8]], [7, [8]]]
b = [first].product(a)
#=> [[[1, 2, 3], [5, [8]]],
# [[1, 2, 3], [6, [8]]],
# [[1, 2, 3], [7, [8]]]]
b.map(&:flatten)
#=> [[1, 2, 3, 5, 8],
# [1, 2, 3, 6, 8],
# [1, 2, 3, 7, 8]]