scala - 在 Scala 中连接两个长度不等的列表

标签 scala scala-collections

我有 2 个列表:

val list_1 = List((1, 11), (2, 12), (3, 13), (4, 14))
val list_2 = List((1, 111), (2, 122), (3, 133), (4, 144), (1, 123), (2, 234))

我想将第二个列表中的键替换为第一个列表的值,从而生成如下所示的新列表:

List ((11, 111), (12, 122), (13, 133), (14, 144), (11, 123), (12, 234))

这是我的尝试:

object UniqueTest {
  def main(args: Array[String]){
     val l_1 = List((1, 11), (2, 12), (3, 13), (4, 14))
     val l_2 = List((1, 111), (2,122), (3, 133), (4, 144), (1, 123), (2, 234))
     val l_3 = l_2.map(x => (f(x._1, l_1), x._2))
     print(l_3)

  }
  def f(i: Int, list: List[(Int, Int)]): Int = {
    for(pair <- list){
      if(i == pair._1){
        return pair._2
      }
    }
    return 0
  }
}

这导致:

((11, 111), (12, 122), (13, 133), (14, 144), (11, 123), (12, 234))

上面的程序是执行此操作的好方法吗? Scala 中是否有内置函数来处理这种需求,或者是否有其他方法来进行这种操作?

最佳答案

唯一真正过于复杂的是这一行:

val l_3 = l_2.map(x => (f(x._1, l_1), x._2))

您的 f 函数使用命令式样式循环遍历列表以查找键。任何时候你发现自己这样做,都很好地表明你想要的是 map。 .通过在每次爆炸计算复杂性时执行 for 循环:映射将允许您在 O(1) 中获取给定键的相应值。使用映射,您首先将列表(键值对)转换为明确支持键值对关系的数据结构。

因此,您应该做的第一件事就是构建您的 map 。 Scala 使用 toMap 提供了一种非常简单的方法来做到这一点:

val map_1 = list_1.toMap

那么这只是“映射”的问题:

val result = list_2.map { case (key, value) => map_1.getOrElse(key, 0), value) }

这会获取您的 list_2 中的每个案例,将第一个值 (key) 与您的 map_1 中的键匹配,检索该值 (或默认的 0) 并将其作为键值元组中的第一个值。

关于scala - 在 Scala 中连接两个长度不等的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185632/

相关文章:

scala - PySpark 等效于来自 Scala API 的函数 "typedLit"

java - 将一次性代码交换为刷新 token 时出现 Google OAuth redirect_uri_mismatch

json - 将任何Scala对象转换为JSON

Scala SetBuffer

string - 为什么Scala中的drop()方法允许负值并且不会抛出错误?

scala - 如何让 Scala 的不可变集合保存不可变对象(immutable对象)

scala - 如何从 Play 中的请求中获取 InputStream

java - 将 Spark 作业写入 NFSv3 安装卷的变音问题

scala - 在 Scala 中合并两个 HashMap

scala - 计算 Scala 中 List[List[T]] 中每个元素的出现次数