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

Mar*_*man 1 scala

以下是一些改编自在线Scala教程的代码:

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 )
   }
}
Run Code Online (Sandbox Code Playgroud)

以下是结果:

fruit1 ++ fruit2:列表(苹果,橘子,梨,芒果,香蕉)

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

List连接按照我的预期工作,但我永远不会预测Set连接的结果顺序.任何人都可以解释结果是如何得出的?这里的在线教程没什么帮助.

Tra*_*own 6

scala.collection.Set 没有提供任何关于遍历顺序的保证 - 如果你要求一个字符串表示一个,你得到的顺序是未指定的,取决于实现.

某些子类scala.collection.Set 确实提供了关于顺序的保证 - 例如,在迭代通过a时看到的顺序collection.immutable.SortedSet取决于Ordering您用于构造集合的实例,并将collection.mutable.LinkedHashSet按插入顺序迭代其元素.当你正在使用任意的Set,但是,你应该永远,永远,靠的顺序,你碰巧使用的时候看到toString,foreach等等.