在Scala中的两个列表之间交换元素时生成所有可能性

Meiko Rachimow

寻找一个优雅的解决方案:我有两个列表,希望在交换元素时创建所有可能的结果(列表大小相同,仅在相同位置交换)

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))
  1. 一旦生成subsets要交换的索引
  2. 我们可以fold使用带有输入列表的元组作为零/种子
  3. 在来自 的每个索引处Set,我们不可变地交换两个列表的元素a(i)<->b(i)

对于长列表,它很干净但效率不高。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在python中的两个列表之间交换两个元素

来自分类Dev

如何获得在 C++ 中的无限数组中添加两个索引的所有可能性

来自分类Dev

我如何从两个列表中选择一个随机项目,然后从所有可能性中建立的另一个列表中删除该项目集

来自分类Dev

从两个列表中获取元素的所有组合?

来自分类Dev

在两个元素之间的列表中查找所有元素(不使用索引,并且带有环绕)

来自分类Dev

C ++中两个向量之间的元素交换

来自分类Dev

使用两个列表并生成所有第二个元素的列表的函数

来自分类Dev

在javascript中的两个选择框之间交换所有值

来自分类Dev

在python列表中交换两个元素时的一些麻烦

来自分类Dev

通过其索引交换列表中的两个元素

来自分类Dev

协变交换列表中的两个元素

来自分类Dev

Python:无法交换列表中的两个元素

来自分类Dev

搜索交换两个关联容器的无锁可能性

来自分类Dev

在模板类型列表中交换两个元素。寻求最有效的算法

来自分类Dev

交换两个列表的元素

来自分类Dev

当任何两个元素之间的比较可能不明确时,对列表进行排序?

来自分类Dev

查找两个列表x和y之间的配对的所有组合,以使y中的所有元素与x中的一个正好配对

来自分类Dev

不使用表格选择两个日期之间的所有日期(生成日期列表)

来自分类Dev

生成两个值(OCaml或其他语言)之间给定长度的所有列表

来自分类Dev

获取两个列表之间的所有可能组合,包括多个连接

来自分类Dev

获取两个大列表之间的所有不匹配元素

来自分类Dev

生成两个列表的所有可能组合的热矩阵?

来自分类Dev

查看两个表之间的所有可能组合

来自分类Dev

两个列表之间没有重复的公共元素

来自分类Dev

Scala中的组合学:如何迭代/枚举合并多个序列/列表的所有可能性(浅随机排列)

来自分类Dev

生成表中存储的两个日期之间的所有日期

来自分类Dev

如何生成两种硬币的所有可能组合以及三种可能性(向上,向下和之间)

来自分类Dev

如何生成两种硬币的所有可能组合以及三种可能性(向上,向下和之间)

来自分类Dev

查找两个列表的所有可能的交点

Related 相关文章

  1. 1

    在python中的两个列表之间交换两个元素

  2. 2

    如何获得在 C++ 中的无限数组中添加两个索引的所有可能性

  3. 3

    我如何从两个列表中选择一个随机项目,然后从所有可能性中建立的另一个列表中删除该项目集

  4. 4

    从两个列表中获取元素的所有组合?

  5. 5

    在两个元素之间的列表中查找所有元素(不使用索引,并且带有环绕)

  6. 6

    C ++中两个向量之间的元素交换

  7. 7

    使用两个列表并生成所有第二个元素的列表的函数

  8. 8

    在javascript中的两个选择框之间交换所有值

  9. 9

    在python列表中交换两个元素时的一些麻烦

  10. 10

    通过其索引交换列表中的两个元素

  11. 11

    协变交换列表中的两个元素

  12. 12

    Python:无法交换列表中的两个元素

  13. 13

    搜索交换两个关联容器的无锁可能性

  14. 14

    在模板类型列表中交换两个元素。寻求最有效的算法

  15. 15

    交换两个列表的元素

  16. 16

    当任何两个元素之间的比较可能不明确时,对列表进行排序?

  17. 17

    查找两个列表x和y之间的配对的所有组合,以使y中的所有元素与x中的一个正好配对

  18. 18

    不使用表格选择两个日期之间的所有日期(生成日期列表)

  19. 19

    生成两个值(OCaml或其他语言)之间给定长度的所有列表

  20. 20

    获取两个列表之间的所有可能组合,包括多个连接

  21. 21

    获取两个大列表之间的所有不匹配元素

  22. 22

    生成两个列表的所有可能组合的热矩阵?

  23. 23

    查看两个表之间的所有可能组合

  24. 24

    两个列表之间没有重复的公共元素

  25. 25

    Scala中的组合学:如何迭代/枚举合并多个序列/列表的所有可能性(浅随机排列)

  26. 26

    生成表中存储的两个日期之间的所有日期

  27. 27

    如何生成两种硬币的所有可能组合以及三种可能性(向上,向下和之间)

  28. 28

    如何生成两种硬币的所有可能组合以及三种可能性(向上,向下和之间)

  29. 29

    查找两个列表的所有可能的交点

热门标签

归档