【问题标题】:Append matched value of list in scala在scala中追加列表的匹配值
【发布时间】:2017-03-14 01:03:57
【问题描述】:

如何添加此列表:

val aList = List(List(8),List(7),List(6),List(4),List(9))

基于:

val aUpdate = List(8,7,4,2,9)

输出应该是:

val aList = List(List(8,8), List(7,7),List(6),List(4),List(9,9))

我原以为下面的代码可以工作:

val aList = for (i <- 1 to 4) aList map (_(i)) {
case if aList map (_(i)) contains aUpdate(i) => ++ List(map.aUpdate(i))

谁能告诉我输出的有效参数是什么?并请详细解释它是如何工作的。

【问题讨论】:

    标签: scala list for-loop append immutability


    【解决方案1】:

    您的代码不是真的有效。缺少一些东西,例如case 之后的模式标识符、连接之前的列表值、右括号等。

    这是一种方法:

    val r = (aList zip aUpdate).map {
      case (list, update) if (list.contains(update)) => update :: list
      case (list, update) => list
    }
    
    // result: List(List(8, 8), List(7, 7), List(6), List(4), List(9, 9))
    

    将一个列表与另一个列表压缩会产生一个对列表,其中第 n 个对由第一个列表中的第 n 个元素和第二个列表中的第 n 个元素组成。现在您可以轻松地做您想做的事;如果来自aList 的元素包含来自aUpdate 的元素,则将其添加到列表中,否则(注意第二种情况具有相同的标识符,但没有条件)只返回来自aList 的元素。

    【讨论】:

    • 好答案!我试图将第二个案例留空以消除 6 和 4。但是为什么它将空白列表带到r?所以结果变成r: List[Any] = List(List(8, 8), List(7, 7), (), (), List(9, 9))
    • 因为您返回一个空值,或者更专业地说,是一个 Unit 值。尝试先过滤,然后映射:(aList zip aUpdate).filter { case (list, update) =&gt; (list.contains(update)) }.map { case (list, update) =&gt; update :: list } 请注意,您也可以使用 withFilter 代替 filter 以避免创建中间集合(也就是说,您将一次性过滤和映射; withFilter 只是限制域为即将到来的地图)。
    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 2015-07-27
    • 2017-10-14
    • 2018-10-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多