使用scala从列表中找到四个总和为给定值的元素

时间:2018-09-10 12:57:22

标签: scala list functional-programming

我是Scala编程语言的新手,并希望实现具有以下scenerio的代码。 给定一个由n个整数和一个整数sampleree组成的列表样本,样本中有元素a,b,c和d,使得a + b + c + d =样本3。在列表中找到所有唯一的四元组,从而得出三样本之和

示例:

sampleone =[1,0,-1,0,-2,2] and samplethree = 0 
a solution set is 
[-1,0,0,1]
[-2,-1,1,2]
[-2,0,0,2]

我使用的代码是

scala> def findFourElements(A: List[Int], n: Int, x: Int) = {
     | {
     | for(a <- 0 to A.length-3)
     | {
     | for(b <- a+1 to A.length-2)
     | {
     | for(c <- b+1 to A.length-1)
     | {
     |  for(d <- c+1 to A.length)
     | {
     | if(A(a) + A(b) + A(c) + A(d) == x)
     | {
     | print(A(a)+A(b)+A(c)+A(d))
     | }}}}}}
     | }
findFourElements: (A: List[Int], n: Int, x: Int)Unit


scala> val sampleone = List(1,0,-1,0,-2,2)
sampleone: List[Int] = List(1, 0, -1, 0, -2, 2)

scala> val sampletwo = sampleone.length
sampletwo: Int = 6

scala> val samplethree = 0
samplethree: Int = 0

scala> findFourElements(sampleone,sampletwo,samplethree)
0java.lang.IndexOutOfBoundsException: 6
  at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:65)
  at scala.collection.immutable.List.apply(List.scala:84)
  at $anonfun$findFourElements$1$$anonfun$apply$mcVI$sp$1$$anonfun$apply$mcVI$sp$2$$anonfun$apply$mcVI$sp$3.apply$mcVI$sp(<console>:33)
  at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:160)
  at $anonfun$findFourElements$1$$anonfun$apply$mcVI$sp$1$$anonfun$apply$mcVI$sp$2.apply$mcVI$sp(<console>:31)
  at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:160)
  at $anonfun$findFourElements$1$$anonfun$apply$mcVI$sp$1.apply$mcVI$sp(<console>:29)
  at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:160)
  at $anonfun$findFourElements$1.apply$mcVI$sp(<console>:27)
  at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:160)
  at findFourElements(<console>:25)
  ... 48 elided

但是我得到索引错误超出范围的异常。 还有一种在scala中拥有更优化代码的方法。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

这可能会做您想要的:

sampleone.combinations(4).filter(_.sum == samplethree)
  

combinations方法提供了一个迭代器,该迭代器依次传递每个可能的值组合。如果构建同一序列的方法不止一种,那么只会返回一种。

filter调用将删除所有不等于samplethree值的序列。