【问题标题】:How match elements from two lists in scala?如何匹配scala中两个列表中的元素?
【发布时间】:2014-10-10 10:20:02
【问题描述】:

我有两个列表如下 -

val a = List((HarddiskVolume1,31,1), (C:,46552070,433057), (E:,5435,1728), (_Total,46557536,434786))
val b =  List(C:, E:)

我想要输出如下: o/p (C:,46552070,433057), (E:,5435,1728)

如何使用 scala 获得所需的输出?

【问题讨论】:

    标签: list scala collections


    【解决方案1】:
    val a = List(("HarddiskVolume1",31,1), ("C:",46552070,433057), ("E:",5435,1728), ("_Total",46557536,434786))     
    
    val b =  List("C:", "E:")
    
    a.filter(x => b.contains(x._1))  // if b is large, consider making it a set.
    // res0: List[(String, Int, Int)] = List((C:,46552070,433057), (E:,5435,1728))
    

    【讨论】:

    • 嗨,如果我的列表为 val a =List(List((HarddiskVolume1,31,1), (C:,46552070,433057), (E:,5435,1728), (_Total,46557536,434786)), List((HarddiskVolume1,31,1), (C:,46552070,433057), (E:,5435,1728), (_Total,46557536,434786))) 那么应该如何过滤添加?
    【解决方案2】:

    像这样使用collect

    val keys = b.toSet
    a collect { case z@(x,_,_) if keys(x) => z }
    

    更新

    其他类似的方法包括

    for ( z <- a if keys(z._1) ) yield z
    
    a collect { case z if keys(z._1) => z }
    
    ( a partition ( z =>  keys(z._1) ) )._1
    

    【讨论】:

      【解决方案3】:

      在数据作为列表存在的情况下回答@Yogesh:

      val aa =List(List(("HarddiskVolume1",31,1), ("C:",46552070,433057), ("E:",5435,1728), ("_Total",46557536,434786)),
                   List(("HarddiskVolume1",31,1), ("C:",46552070,433057), ("E:",5435,1728), ("_Total",46557536,434786))
                  )
      val b =  List("C:", "E:")
      
      aa.map(l => l.filter(x => b.exists(_== x._1))) 
      

      与 Shyamendra 类似,但在列表中使用存在运算符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-29
        • 1970-01-01
        • 2015-05-30
        • 1970-01-01
        • 1970-01-01
        • 2018-06-13
        • 1970-01-01
        • 2018-10-21
        相关资源
        最近更新 更多