寻找一个优雅的解决方案:我有两个列表,希望在交换元素时创建所有可能的结果(列表大小相同,仅在相同位置交换)
val a = List(1,2,3)
val b = List(4,5,6)
...
//result
List(
(List(1,2,3), List(4,5,6)),
(List(1,2,6), List(4,5,3)),
(List(1,5,3), List(4,2,6)),
(List(1,5,6), List(4,2,3)),
(List(4,2,3), List(1,5,6)),
(List(4,2,6), List(1,5,3)),
(List(4,5,3), List(1,2,6)),
(List(4,5,6), List(1,2,3))
)
我可以用循环来做到这一点,但我想使用不可变列表,并且不明白如何使用生成器函数 ( yield
)来做到这一点。任何想法?
一种可能的解决办法是的组合.subsets
和.updated
:
scala> Set(0,1,2).subsets
Set()
Set(0)
Set(1)
Set(2)
Set(0, 1)
Set(0, 2)
Set(1, 2)
Set(0, 1, 2)
scala> (a.updated(0,b(0)), b.updated(0,a(0)))
(List(4, 2, 3),List(1, 5, 6))
所以:
scala> (0 to a.length - 1).toSet.subsets
.map(_.foldLeft((a,b)){
case (acc, i) => (acc._1.updated(i,b(i)), acc._2.updated(i,a(i)))})
(List(1, 2, 3),List(4, 5, 6))
(List(4, 2, 3),List(1, 5, 6))
(List(1, 5, 3),List(4, 2, 6))
(List(1, 2, 6),List(4, 5, 3))
(List(4, 5, 3),List(1, 2, 6))
(List(4, 2, 6),List(1, 5, 3))
(List(1, 5, 6),List(4, 2, 3))
(List(4, 5, 6),List(1, 2, 3))
subsets
要交换的索引fold
使用带有输入列表的元组作为零/种子Set
,我们不可变地交换两个列表的元素a(i)<->b(i)
对于长列表,它很干净但效率不高。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句