同时循环两个列表的Scala for循环

39

我有一个 List[Message] 和一个 List[Author],它们具有相同数量的项目,并且应该按顺序排序,以便在每个索引处,Message 来自于相应的 Author

我还有一个类,我们在这里称之为 SmartMessage,它有一个构造函数,接受2个参数:一个 Message 和相应的 Author

我的目标是创建一个 List[SmartMessage],将这2个简单列表的数据合并。

额外问题:在Scala中,List是否保留插入顺序?只是为了确保我创建了一个带有相同排序的 List[Message]List[Author]


2
zip函数只能处理三个列表,如果您有更多的列表需要处理,推荐查看以下问题/答案链接:https://dev59.com/EHPYa4cB1Zd3GeqPgTzC#17072064 - Luigi Plinge
1个回答

83

你可以使用zip

val ms: List[Message] = ???
val as: List[Author] = ???

var sms = for ( (m, a) <- (ms zip as)) yield new SmartMessage(m, a)

如果你不喜欢for-comprehensions,你可以使用map

var sms = (ms zip as).map{ case (m, a) => new SmartMessage(m, a)}

方法zip创建一对一对的集合。在这种情况下,是一个List[(Message, Author)]

你也可以使用Tuple2(和Tuple3)上的zipped方法:

var sms = (ms, as).zipped.map{ (m, a) => new SmartMessage(m, a)}

正如你所看到的,在这种情况下,map 中不需要模式匹配。

额外信息

ListSeqSeq 保留顺序。请参见scala collections 概述

Scala 的集合有三个主要分支:SeqSetMap

  • Seq 保留元素的顺序。
  • Set 不包含重复元素。
  • Map 包含从键到值的映射。

在 Scala 中,List 是一个链表,因此应该在其前面添加元素而不是追加。请参见 Scala 集合的性能特征


在将一个包含数据的列表与一个空列表压缩在一起时,需要记住的一件事是结果也将是一个空列表。因此,您可能需要确保您的代码可以处理这种情况。否则,您可以先检查其中一个列表是否为空,或者使用带有默认值的zipAll()函数。 - markus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接