【问题标题】:How do I create a List by applying an operation to all elements of a scala Map?如何通过对 Scala Map 的所有元素应用操作来创建列表?
【发布时间】:2014-10-10 17:41:14
【问题描述】:

我有一个 scala 映射 myMap,我想创建一个列表 MyList,如下所示:

对于 myMap 中的每个 (k,v),MyList 都应该将元组 (v.someMember, k) 作为一个元素

使用mapfor 理解的结果是一个新的地图。有没有更好的方法来做到这一点,而不是从一个空列表开始并在我循环遍历 map 中的 (key, value) 对时添加元素

var myList = List.empty[(Double, String)]
myMap foreach { case(k,v) => myList ::= (v.someMember, k) }

【问题讨论】:

    标签: scala


    【解决方案1】:

    使用toList,然后使用map

    例如:

    scala> Map("a" -> 1, "b" -> 2).toList.map { case (k, v) => (k.size, v) }
    res12: List[(Int, Int)] = List((1,1), (1,2))
    

    或者,如果您想提高内存效率并且不分配中间列表,您可以在maping 和breakOut 时构建列表

    import scala.collection.breakOut
    
    scala> val l: List[(Int, Int)] = Map("a" -> 1, "b" -> 2).map({ case (k, v) => (k.size, v) })(breakOut)
    l: List[(Int, Int)] = List((1,1), (1,2))
    

    【讨论】:

    • 谢谢!正是我想要的
    【解决方案2】:

    也考虑这个理解语法(这里语义上等同于map,正如已经建议的);例如

    val myMap = Map (1.1 -> "abc" , 2.2 -> "xyz")
    
    for ( (k,v) <- myMap.toList ) yield v(2) -> k
    

    在问题陈述之后,

    for ( (k,v) <- myMap.toList ) yield v.someMember -> k
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2019-03-31
      • 2015-06-03
      相关资源
      最近更新 更多