如何在scala中有效地查找多维数组/列表中的所有组合?

时间:2015-08-12 16:16:45

标签: arrays scala combinations

我有一个数组,

数组(数组(A,B),数组(I,J),数组(M,N),数组(P))

请帮助找出其中所有可能的组合,如下所示。 提前谢谢。

 ( A , I )
 ( A , J )  
 ( B , I )  
 ( B , J )  
 ( A , M )  
 ( B , M )  
 ( B , N )  
 ( A , P )  
 ( B , P )  
 ( I , M )  
 ( I , N )  
 ( J , M )  
 ( J , N )  
 ( I , P )  
 ( J , P )  
 ( M , P )  
 ( N , P )  
 ( A , I , M )
 ( A , I , N )
 ( A , J , M )
 ( A , J , N )
 ( B , I , M )
 ( B , I , N )
 ( B , J , M )
 ( B , J , N )
 ( A , I , P )
 ( A , J , P )
 ( B , I , P )
 ( B , J , P )
 ( A , M , P )
 ( A , N , P )
 ( B , M , P )
 ( B , N , P )
 ( I , M , P )
 ( I , N , P )
 ( J , M , P )
 ( J , N , P )

1 个答案:

答案 0 :(得分:1)

这样做:

val input = List(List("A", "B"), List("I", "J"), List("M", "N"), List("P"))

val result =
  (2 to input.size).toList.flatMap {
    combSize => input.combinations(combSize).flatMap {
      comb =>
        comb.dropRight(1).foldRight(comb.takeRight(1).transpose) {
          (el, accum) =>
            accum.flatMap(accEl => el.map(_ :: accEl))
        }
    }.toList
  }

结果:

List(A, I)
List(B, I)
List(A, J)
List(B, J)
List(A, M)
List(B, M)
List(A, N)
List(B, N)
List(A, P)
List(B, P)
List(I, M)
List(J, M)
List(I, N)
List(J, N)
List(I, P)
List(J, P)
List(M, P)
List(N, P)
List(A, I, M)
List(B, I, M)
List(A, J, M)
List(B, J, M)
List(A, I, N)
List(B, I, N)
List(A, J, N)
List(B, J, N)
List(A, I, P)
List(B, I, P)
List(A, J, P)
List(B, J, P)
List(A, M, P)
List(B, M, P)
List(A, N, P)
List(B, N, P)
List(I, M, P)
.....