Combinaison ruby​​ Array multidimensionnel得到一个二维数组

时间:2015-10-23 09:37:38

标签: arrays ruby

我有一个Array multidimensionnel,如:

[[1, 1, 4], [2],[2, 3]]

如何在同一阵列中获得除组合之外的每个元素的组合:[1,1],[1,4],[2,3]

我想得到:

[1, 2],[1, 3],[4, 2],[4, 3],[2, 3]

感谢。

2 个答案:

答案 0 :(得分:3)

简短回答是:

[[1, 1, 4], [2],[2, 3]].combination(2).flat_map {|x,y| x.product(y)}.uniq
# => [[1, 2], [4, 2], [1, 3], [4, 3], [2, 2], [2, 3]]

一步一步

  1. step1 = [[1, 1, 4], [2],[2, 3]].combination(2) 
    # => [[[1, 1, 4], [2]], [[1, 1, 4], [2, 3]], [[2], [2, 3]]]
    
  2. step2 = step1.flat_map {|x,y| x.product(y)}
    # => [[1, 2], [1, 2], [4, 2], [1, 2], [1, 3], [1, 2], [1, 3], [4, 2], [4, 3], [2, 2], [2, 3]]
    
  3. result = step2.uniq
    # => [[1, 2], [4, 2], [1, 3], [4, 3], [2, 2], [2, 3]]
    
  4. <强>更新

    要获得完全唯一性,您可以使用:

    [[1, 1, 4], [2],[2, 3, 4]].combination(2).flat_map {|x,y| x.product(y)}.map(&:sort).uniq
    

答案 1 :(得分:1)

arr = [[1, 1, 4], [2], [2, 3]]

a = arr.map(&:uniq)
(arr.size-1).times.flat_map { |i| arr[i].product(arr[i+1..-1].flatten.uniq)}.uniq
  #=> [[1,2],[1,3],[4,2],[4,3],[2,2],[2,3]]

以下是另一种使用我定义here的方法Array#difference的方式:

arr.flatten.combination(2).to_a.difference(arr.flat_map { |a| a.combination(2).to_a }).uniq

Array#differenceArray#-类似。以下示例说明了不同之处:

a = [1,2,3,4,3,2,2,4]
b = [2,3,4,4,4]

a     -      b #=> [1]
a.difference b #=> [1, 3, 2, 2]