Arrays 如何在Scala中实现数组中组合的生成
我想要一个函数的Scala代码,给定一个数组,它生成数组的k个组合 考虑生成由5个元素组成的数组的3个组合。例如,函数(例如Arrays 如何在Scala中实现数组中组合的生成,arrays,algorithm,scala,combinations,Arrays,Algorithm,Scala,Combinations,我想要一个函数的Scala代码,给定一个数组,它生成数组的k个组合 考虑生成由5个元素组成的数组的3个组合。例如,函数(例如computeNCK)的行为如下: computeNCK(Array(1,2,3,4,5),3) = Array(Array(1, 2, 3), Array(1, 2, 4), Array(1, 2, 5), Array(1, 3, 4), Array(1, 3, 5), Array(1, 4, 5), Array(2, 3, 4), Array(2, 3, 5), Arr
computeNCK
)的行为如下:
computeNCK(Array(1,2,3,4,5),3) = Array(Array(1, 2, 3), Array(1, 2, 4), Array(1, 2, 5), Array(1, 3, 4), Array(1, 3, 5), Array(1, 4, 5), Array(2, 3, 4), Array(2, 3, 5), Array(2, 4, 5), Array(3, 4, 5))
该程序的工作原理类似于列表
的组合(n:Int):迭代器[List[A],但我想处理数组
注意:我想到的代码直接处理数组
,而不是首先计算其他数据类型(如列表
)并将其转换为数组
(使用toArray
)
换句话说,该程序就像下面的Scala代码的“数组版本”,用于计算k组合
def computeNCK[A](l:List[A], n: Int): List[List[A]] =
if (n > l.size) Nil
else l match {
case _ :: _ if n == 1 => l.map(List(_))
case hd :: tl => computeNCK(tl, n - 1).map(hd :: _) ::: computeNCK(tl,n)
case _ => Nil
}
你不能使用Array.combines方法吗
scala> Array("a","b","c", "d").combinations(2).toList
res0: List[Array[String]] = List(Array(a, b), Array(a, c), Array(a, d), Array(b, c), Array(b, d), Array(c, d))
组合(n:Int)
也适用于数组
<代码>数组(1,2,3,4,5)。组合(3)返回类型为Iterator[Array[Int]]]
No的值。我需要函数返回Array[Array[Int]
而不是Iterator[Array[Int]]
,因为Iterator
在迭代海量数据时存在性能问题。当然,Array(1,2,3,4,5).组合(3).toArray
不适用于我的目的,原因是。不,它不适用于我的目的。正如我在问题中所写的那样,我需要避免使用类型转换,如toList
或toArray
,因为我必须缩放此函数,因此此类类型转换会造成显著的性能损失。