如何用Seq[String]过滤Scala的Seq[(String, String)]并提取对应值
Scala 根据指定序列提取对应元组值的实现方法
这里提供两种常用的实现方式,可根据数据规模和需求选择:
方法1:转换为Map后提取(推荐,高效)
先把元组序列转换成Map[String, String],利用Map的O(1)查找特性,遍历seqA直接提取对应值,这种方式时间复杂度最优,适合大数据量场景:
val tupleSeq: Seq[(String, String)] = Seq( ("aaa", "A_A_A"), ("bbb", "B_B_B"), ("ccc", "C_C_C") ) val seqA: Seq[String] = Seq("aaa", "bbb") // 将元组序列转为Map,键为元组第一个元素,值为第二个元素 val tupleMap = tupleSeq.toMap // 遍历seqA,从Map中取出对应的值 val seqB = seqA.map(tupleMap(_)) // 输出结果:Seq("A_A_A", "B_B_B")
如果seqA中存在tupleSeq没有的键,可以用getOrElse设置默认值,避免抛出NoSuchElementException:
// 不存在的键默认返回空字符串,可自定义默认值 val seqBWithDefault = seqA.map(key => tupleMap.getOrElse(key, ""))
方法2:过滤+映射(适合小数据量)
通过flatMap结合find,逐个匹配seqA中的元素,找到对应元组后提取值。这种方式无需转换结构,但每次查找都是线性遍历,数据量大时效率较低:
val seqB = seqA.flatMap(targetKey => tupleSeq.find(_._1 == targetKey).map(_._2))
说明
- 方法1的时间复杂度为O(n + m)(n是tupleSeq长度,m是seqA长度),性能更优;
- 方法2的时间复杂度为O(n*m),仅推荐在数据量较小时使用。
内容的提问来源于stack exchange,提问作者Mamaf
相关产品推荐
相关产品推荐

