将多个数组组成一个数组

时间:2016-08-03 07:46:23

标签: ruby

鉴于

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

这就是为什么有些答案没有反映上面修改过的例子。

4 个答案:

答案 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]]