【问题标题】:Scala Set - default behaviorScala Set - 默认行为
【发布时间】:2014-10-03 08:23:57
【问题描述】:

想知道scala是如何排列set中的数据的。

scala> val imm = Set(1, 2, 3, "four")                  //immutable variable
imm  : scala.collection.immutable.Set[Any] = Set(1, 2, 3, four)

scala> var mu = Set(1, 2, 3, "four", 9)  
mu: scala.collection.immutable.Set[Any] = Set(four, 1, 9, 2, 3)

scala> mu += "five"

scala> mu.toString 
res1: String = Set(four, 1, 9, 2, 3, five)

在不可变 Set 的情况下插入顺序保持不变,但在可变 Set 中则不存在。 此外,无论我用 var xyz = Set(1, 2, 3, "four", 9) 创建一个新集合多少次,存储的顺序都保持不变 Set(four, 1, 9, 2, 3)。所以它不是随机存储的,它背后有一些我想知道的逻辑。而且,这样的行为有什么好处吗?

【问题讨论】:

  • “它不是随机存储的,它背后有一些逻辑” - 好吧,你以为它背后没有逻辑吗?此外,计算机在“随机”方面非常糟糕。谷歌“哈希表”。
  • 除非你使用 sorted impl (SortedSer),否则 set 只保证元素是唯一的,与 order 无关,那里有实现细节。想知道的话可以看源码。

标签: scala set scala-collections


【解决方案1】:

套装没有顺序。一个项目在集合中或不在集合中。这就是你所能知道的关于集合的全部内容。

如果您需要某种排序,则需要使用有序集或可能的排序集。

当然,集合的任何特定实现可能会或可能不会偶然具有在多次调用中可能会或可能不会稳定的顺序,但这纯粹是偶然的实现细节,可能会在更新期间随时更改Scala 甚至在两次调用之间。

【讨论】:

  • 确切地说,集合确实有排序,只是不是插入排序。
  • @Jorg W Mittag,我同意你的观点,即这种行为可能会在 Scala 的进一步更新中发生变化。因为,遵循插入顺序的不可变 Set 和不遵循插入顺序的可变 Set 对我来说毫无意义。
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多