组合和嵌套for循环

时间:2014-10-05 10:33:11

标签: scala scala-2.10

假设我有以下数组:

val x  = Array(Array(1,2,3),Array(4,5,6),Array(7,8,9))

并希望获得所有组合:

(1,4,7-) (1,4,8) (1,4,9) (1,5,7) (1,5,8) (1,5,9) (1,6,7)... (3,6,7) (3,6,8) (3,6,9)

我会写:

  def comb = for (
      a <- 0 until 3;
      b <- 0 until 3;
      c <- 0 until 3
    ) yield (x(0)(a),x(1)(b),x(2)(c))
    comb foreach println

我想知道一种更有效的方法,使用更少的内存,因为我需要为10x16阵列而不是3x3阵列。

我尝试过制作16个嵌套循环,但是我的内存不足(我相信)它必须制作10 ^ 16个组合。

1 个答案:

答案 0 :(得分:2)

对于10x16阵列,您将在内存中将10 ^ 16个组合作为输出。你唯一可以做的就是 - 使用迭代器而不是列表来接收它:

def comb = for (
  a <- 0 until 3 toIterator;
  b <- 0 until 3 toIterator;
  c <- 0 until 3 toIterator
) yield (x(0)(a),x(1)(b),x(2)(c))

之后,您可以在输出之前映射+减少结果。

您也可以查看Streams,但是他们在迭代期间将结果保存到内存中 - 因此您必须在应用任何副作用之前减少它们(例如foreach)。