代码之家  ›  专栏  ›  技术社区  ›  bbgghh

在scala中连接两个列表时如何处理不匹配的键

  •  0
  • bbgghh  · 技术社区  · 2 年前

    我是scala的新手,在按键值合并或加入两个列表(不知道scala中的确切术语)时遇到问题。在一个案例中,键值不匹配,我选择了java。util。NoTouchElementException:找不到密钥错误。但我只想要匹配的病例。我的示例代码片段如下:

    val users = List(
      (1,1,4.0),
      (1,3,4.0),
      (1,6,4.0)
    )
    
    val cars = List(
      (1,1,"ww"),
      (1,3,"mds"),
      (2,6,"pgt")
    )
    
    val usersmapped = users.map(i => ((i._1,i._2),i)).toMap
    val carsmapped = cars.map(i => ((i._1,i._2),i)).toMap
    val result  = carsmapped.map(ar => (ar._2,usersmapped(ar._1)._3))
    

    上面代码的错误消息是:java。util。未发现异常:(2:nocentelemeption)

    我的目标是这样:

    List(
    (1,1,ww) -> 4.0, 
    (1,3,mds)-> 4.0
    )
    

    List(
    (1,1,ww) -> 4.0, 
    (1,3,mds) -> 4.0,
    (1,6,null) -> 4.0  //null means no match with other list 
    )
    

    特别是第一个是可能的吗?我该怎么做?

    我试过了,但没有结果:

      val result  = Try(carsmapped.map(ar => (ar._2,usersmapped(ar._1)._3)))
      ).toOption
    

    如果你能帮忙,我将不胜感激

    1 回复  |  直到 2 年前
        1
  •  2
  •   User9123    2 年前

    使用 get 方法而不是“()”。get方法返回 Option :

    val users = List(
      (1,1,4.0),
      (1,3,4.0),
      (1,6,4.0)
    )
    
    val cars = List(
      (1,1,"ww"),
      (1,3,"mds"),
      (2,6,"pgt")
    )
    
    val usersmapped = users.map(i => ((i._1,i._2),i)).toMap
    val carsmapped = cars.map(i => ((i._1,i._2),i)).toMap
    
    carsmapped
      .map(ar => (ar._2, usersmapped.get(ar._1).map(_._3)))
      .foreach(println)