Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 不同集合类型的性能和使用情况比较_Scala_Scala Collections - Fatal编程技术网

Scala 不同集合类型的性能和使用情况比较

Scala 不同集合类型的性能和使用情况比较,scala,scala-collections,Scala,Scala Collections,我已经在Scala编程几个月了。我仍然对许多不同的收藏感到困惑 是否有某个页面/文章显示每种类型最适合哪种类型 Scala的问题是它有太多不同的类型,然后你有类似数组的东西直接映射到Java数组,然后你有类似“Set”的东西实际上是一个“trait”,但你可以像普通类一样使用它,尽管我的理解是trait就像一个接口。文档中说“要实现一个具体的集合,需要定义以下方法:…”,但实际上我可以很好地使用它 整件事让我很困惑。来自C#/.NET,事情非常清楚,我没有像“LinkedHashMap”和“Li

我已经在Scala编程几个月了。我仍然对许多不同的收藏感到困惑

是否有某个页面/文章显示每种类型最适合哪种类型

Scala的问题是它有太多不同的类型,然后你有类似数组的东西直接映射到Java数组,然后你有类似“Set”的东西实际上是一个“trait”,但你可以像普通类一样使用它,尽管我的理解是trait就像一个接口。文档中说“要实现一个具体的集合,需要定义以下方法:…”,但实际上我可以很好地使用它

整件事让我很困惑。来自C#/.NET,事情非常清楚,我没有像“LinkedHashMap”和“LinkedHashSet”这样的奇怪类型。

使用trait(接口)Seq(有序列表)、Map(键值)、Set、IndexedSeq、Array(对于Java原语)类型,并让编译器选择实现。如果你看源,你会看到每个源都有一个伴星。这将使用工厂为您查找实现

这一页帮助了我。

关于具体集合的部分将介绍实现

Seq伴生对象:

object Seq extends SeqFactory[Seq] {
  /** $genericCanBuildFromInfo */
  implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Seq[A]] = ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]]

  def newBuilder[A]: Builder[A, Seq[A]] = immutable.Seq.newBuilder[A]
}

查看factory源代码,了解apply如何初始化集合

abstract class GenericCompanion[+CC[X] <: GenTraversable[X]] {
  /** The underlying collection type with unknown element type */
  type Coll = CC[_]

  /** The default builder for `$Coll` objects.
   *  @tparam A      the type of the ${coll}'s elements
   */
  def newBuilder[A]: Builder[A, CC[A]]

  /** An empty collection of type `$Coll[A]`
   *  @tparam A      the type of the ${coll}'s elements
   */
  def empty[A]: CC[A] = newBuilder[A].result

  /** Creates a $coll with the specified elements.
   *  @tparam A      the type of the ${coll}'s elements
   *  @param elems  the elements of the created $coll
   *  @return a new $coll with elements `elems`
   */
  def apply[A](elems: A*): CC[A] = {
    if (elems.isEmpty) empty[A]
    else {
      val b = newBuilder[A]
      b ++= elems
      b.result
    }
  }
}
抽象类GenericCompanion[+CC[X]
我已经在Scala中编程几个月了,现在我仍然在工作
被许多不同的收藏搞糊涂了

您可能只需要一些时间就可以习惯。如果Scala看起来完全像另一种语言,它就不是Scala了,对吗?:)每种编程语言都有其优缺点

是否有一个页面/文章显示每种类型最好 适合做什么

实际上,您需要一篇关于数据结构的一般性文章。例如,如果您需要在集合中存储数据,并且需要在不修改集合的情况下快速访问数据,那么数组是合适的。数组、列表、集合、映射等是基本上在每种语言中表现相同的数据结构。不同之处在于语法ntax

Scala的问题是它有太多不同的类型,然后 有一种类似数组的东西,它直接映射到Java数组, 然后你就有了类似于“集”的东西,这实际上是一种“特质”,但是你 即使我的理解是 trait就像一个接口,文档中说“实现 具体设置时,需要定义以下方法:…“但是 事实上我可以用得很好


你应该看看@sam已经发布的链接:这里还有一个:

hmm..使用数组(..)怎么样?如果我使用IndexedSeq(..)这真的可以转化为数组吗?你怎么知道它实际上使用的是哪种类型?我应该关心这一点吗?听起来数组是Java包装的数组,在使用基元类型时,你会获得更好的性能。我通常使用数组作为索引查找集合类型,因为它更容易键入。可能有一些有用的补充这些问题答案中的nal信息:以及