首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala中的集合连接,意外结果

Scala中的集合连接,意外结果
EN

Stack Overflow用户
提问于 2015-11-21 03:09:43
回答 2查看 1.3K关注 0票数 1

下面是改编自Scala在线教程的一小段代码:

代码语言:javascript
运行
复制
object Test {
  def main(args: Array[String]) {
      val fruit1 = List("apples", "oranges", "pears")
      val fruit2 = List("mangoes", "banana")
      val veg1 = Set("potatoes", "carrots", "peas")
      val veg2 = Set("cabbage", "squash")

      var fruit = fruit1 ++ fruit2
      println( "fruit1 ++ fruit2 : " + fruit )
      var vegetable = veg1 ++ veg2
      println( "veg1 ++ veg2 : " + vegetable )
   }
}

结果如下:

fruit1 ++ fruit2 :列表(苹果、橙子、梨、芒果、香蕉)

veg1 ++ veg2 :套餐(卷心菜,豌豆,南瓜,胡萝卜,土豆)

列表连接的工作方式与我预期的一样,但我永远无法预测到集合连接的结果顺序。有人能解释一下结果是如何得出的吗?在线教程在这里没有多大帮助。

EN

Stack Overflow用户

发布于 2015-11-21 03:35:42

请注意,由于Set是一种无序数据结构,因此实现可以随意使用任意顺序。

Set的默认实现在幕后使用HashSet。这是使用散列方法实现的,该方法使O(n)确定项目是否存在于集合中。输出的顺序可能是每个项目生成的散列的顺序,这实际上是随机的。

另一种实现是TreeSet,它以树的形式存储数据,因此是O(log(n)),用于确定集合中是否存在项目。在这种情况下,输出顺序是项在树中的顺序。

下面的代码演示了这一点:

代码语言:javascript
运行
复制
import scala.collection.immutable.{TreeSet, HashSet}

val veg1 = HashSet("potatoes", "carrots", "peas")
val veg2 = HashSet("cabbage", "squash")
val vegetable = veg1 ++ veg2
println( "veg1 ++ veg2 : " + vegetable )
//veg1 ++ veg2 : Set(cabbage, peas, squash, carrots, potatoes)

val trVeg1 = TreeSet("potatoes", "carrots", "peas")
val trVeg2 = TreeSet("cabbage", "squash")
val trVegetable = trVeg1 ++ trVeg2
println( "trVeg1 ++ trVeg2 : " + trVegetable )
//trVeg1 ++ trVeg2 : TreeSet(cabbage, carrots, peas, potatoes, squash)

编辑:

正如Travis Brown在评论中指出的那样,Set的“默认实现”是一个HashSet,这并不完全正确。当项目数量很少时,Scala有特定的Set实现,但是当创建一个超过4个项目的集合时,或者当在Set()实例上使用++运算符创建超过4个项目的Set时,结果是一个HashSet:

代码语言:javascript
运行
复制
val set1 = Set("abc", "def", "ghi")

val set2 = Set("abcd", "defg", "ghij")

set1.getClass
//scala.collection.immutable.Set$Set3

set2.getClass
//scala.collection.immutable.Set$Set3

val concSet = set1 ++ set2

concSet.getClass
//scala.collection.immutable.HashSet$HashTrieSet

小集合实现只有4个项目的集合,所以:

代码语言:javascript
运行
复制
val set3 = Set("abcd", "defg", "ghij", "fghtre", "dfghdd")

set3.getClass
//scala.collection.immutable.HashSet$HashTrieSet

https://github.com/scala/scala/blob/2.12.x/src/library/scala/collection/immutable/Set.scala#L184

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33834304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档