【问题标题】:scala collection conversionsscala 集合转换
【发布时间】:2013-03-02 17:06:08
【问题描述】:

不同的scala.collection对象之间最有效的转换方式是什么?

例如

 val a=scala.collection.mutable.ListBuffer(1,2,0,3)

我想得到scala.collection.mutable.ArrayBuffer

  1. 根据http://docs.scala-lang.org/resources/images/collections.mutable.png,之后转换为BufferArrayBuffer 应该是可能的。对吗?

  2. 一般来说,我可以通过它的共同祖先在 scala 集合中进行任何转换吗? (在前面的例子中,共同祖先是Buffer

PS 我读过http://docs.scala-lang.org/overviews/collections/introduction.html,但找不到关于各种类型之间一般转换的任何信息(我知道类似 .toArray 的方法)

谢谢

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    语法上最有效的应该是 2.10 中引入的 to 方法:

    def to[Col[_]]: Col[A]
    

    通过复制所有元素将此集合转换为另一个集合。 注意:对于无限大小的集合不会终止。

    将其用作a.to[scala.collection.mutable.ArrayBuffer]

    效率方面,除非您进行类似向上转换的转换,将子类型转换为更通用的集合,否则转换将涉及复制元素。在您的示例中,将列表缓冲区转换为缓冲区然后转换为数组缓冲区并不重要——您可以使用to 直接执行此操作,因为您会导致将链表中的元素复制到数组中.

    【讨论】:

    • 感谢您的回答。只有一个小问题:a.to[scala.collection.mutable.ArrayBuffer[Int]] 应该改为 a.to[scala.collection.mutable.ArrayBuffer] 因为 ArrayBuffer 没有类型参数..
    • 你是对的 - 虽然数组缓冲区确实采用类型参数,但 to 方法采用更高种类的类型 Col[_],并将其实例化为元素 A 的类型。
    【解决方案2】:

    回答第 2 题:

    Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_07).
    Type in expressions to have them evaluated.
    Type :help for more information.
    
    scala> import collection.mutable._
    import collection.mutable._
    
    scala> List(1,2,3,4,5)
    res0: List[Int] = List(1, 2, 3, 4, 5)
    
    scala> res0.to[ArrayBuffer]
    res1: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)
    
    scala> res0.to[ListBuffer]
    res2: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4, 5)
    

    只要保持兼容性,您可以随意转换它们:

    scala> res0.to[Map]
    <console>:12: error: scala.collection.mutable.Map takes two type parameters, expected: one
                  res0.to[Map]
                          ^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 2012-07-25
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多