Kotlin:以功能性方式组合列表中的所有元素

Kotlin:以功能性方式组合列表中的所有元素,kotlin,functional-programming,Kotlin,Functional Programming,我是Kotlin的新手,希望将列表中的所有元素组合在一起 我尝试了zipWithNext,但它只将一个元素与下一个元素组合在一起 val letters = ('a'..'f').toList() val pairs = letters.zipWithNext() println(letters) // [a, b, c, d, e, f] println(pairs) // [(a, b), (b, c), (c, d), (d, e), (e, f)] 我

我是Kotlin的新手,希望将列表中的所有元素组合在一起

我尝试了zipWithNext,但它只将一个元素与下一个元素组合在一起

   val letters = ('a'..'f').toList()
   val pairs = letters.zipWithNext()
    
   println(letters) // [a, b, c, d, e, f]
   println(pairs) // [(a, b), (b, c), (c, d), (d, e), (e, f)]
我想要这样的东西:

由此[a,b,c,d] 本[(a,b)、(a,c)、(a,d)、(b,a)、(b,c)、(b,d)、(c,a)、(c,b)、(c,d)、(d,a)、(d,b)、(d,c)]


它可以以命令式的方式完成,但我想知道如何以功能性的方式完成。

您可以使用
flatMap
withIndex
来获取笛卡尔乘积,除了它本身以外的每个元素:

fun main(){
val字母=('a'..'d')。toList()
val pairs=字母.withIndex().flatMap{(i1,e1)->
letters.withIndex().filter{(i2,e2)->
i1!=i2
}.map{(i2,e2)->
对(e1、e2)
}
}
println(字母)/[a,b,c,d]
println(成对)/[(a,b)、(a,c)、(a,d)、(b,a)、(b,c)、(b,d)、(c,b)、(c,d)、(c,b)、(c,d)、(d,a)、(d,b)]
}

如果您不介意在一个管道中完成所有工作(老实说,我鼓励人们更频繁地将事情分解为更小的、命名良好的函数!),您可以执行以下操作

val letters = ('a'..'f').toList()
fun allPairs(c: Char) = letters.map { Pair(c, it) }
val combos = letters.flatMap(::allPairs)
print(combos)


如果您不需要重复项

此处还有一些其他解决方案:如果列表中包含任何重复项(例如“a、b、b、c”),它应该怎么做?
fun allPairs(c: Char) = letters.filterNot { it == c }.map { Pair(c, it) }