【问题标题】:Add sum of values of two lists into new one in scala在scala中将两个列表的值之和添加到新列表中
【发布时间】:2015-04-17 16:07:37
【问题描述】:
v1 = [1,2,3,4]
v2 = [1,2,3,4,5]

我需要这些列表的总和:[2,4,6,8,5]

有没有办法打印执行 a+b= c 的元素,其中 c 是例如 8 ?

我怎样才能在 scala 中做到这一点?

【问题讨论】:

    标签: list scala sum add


    【解决方案1】:

    您可以使用zipAll 将列表压缩在一起。该方法接受两个额外的参数,表示在一个列表比另一个列表长的情况下要使用的元素,反之亦然。由于您要添加列表,因此您应该使用加法标识 0。然后您可以简单地 map 覆盖生成的元组列表:

    val v1 = List(1, 2, 3, 4)
    val v2 = List(1, 2, 3, 4, 5)
    v1.zipAll(v2, 0, 0).map { case (a, b) => a + b }
    

    您可以在IterableLike 的文档中阅读zipAll 的文档。最相关的部分:

    通过成对组合相应的元素,返回由该可迭代集合和另一个可迭代集合形成的可迭代集合。如果两个集合中的一个比另一个短,则使用占位符元素将较短的集合扩展到较长的集合的长度。

    如果您希望打印出某些元素,您可以选择filter 而不是map,然后使用foreach

    v1.zipAll(v2, 0, 0).filter { 
        case(a, b) => a + b == 8 
    }.foreach { 
        case(a, b) => println(s"$a+$b=8") 
    }
    

    或者只是一个foreach 和更有趣的case 语句:

    v1.zipAll(v2, 0, 0).foreach { 
        case(a, b) if a + b == 8  => println(s"$a+$b=8")
        case _ => 
    }
    

    或者你可以使用collect,忽略返回值:

    v1.zipAll(v2, 0, 0).collect { 
        case(a, b) if a + b == 8 => println(s"$a+$b=8") 
    }
    

    您可能想阅读一些关于 Scala 集合库的介绍性文字,例如 docs 中的文字。

    【讨论】:

      【解决方案2】:

      类似于 Ben 的方法,使用 for 理解,

      for ( (a,b) <- v1.zipAll(v2, 0, 0) if a+b == 8 ) yield (a,b)
      

      提供总和为 8 的那些(压缩)值对。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-15
        • 2021-09-25
        • 2016-01-15
        • 1970-01-01
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多