假设我有以下数组:
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个组合。
答案 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)。