11
 scala> Random.shuffle((1 to 10).toSet)
 res10: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)

 scala> Random.shuffle((1 to 10).toSet)
 res11: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)

 scala> Random.shuffle((1 to 10).toSet)
 res12: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)

 scala> Random.shuffle((1 to 10).toList)
 res13: List[Int] = List(3, 9, 8, 5, 7, 6, 10, 2, 1, 4)

 scala> Random.shuffle((1 to 10).toList)
 res14: List[Int] = List(5, 10, 2, 9, 4, 7, 8, 6, 1, 3)

 scala> Random.shuffle((1 to 10).toList)
 res15: List[Int] = List(5, 9, 10, 6, 8, 3, 4, 1, 7, 2)

シャッフルはリストをうまく処理できますが、セットは処理できませんか? セットをシャッフルできませんか? なぜ res10 == res11 == res12 なのですか?

4

2 に答える 2

20

Scala のセットは順序付けされていません (数学的なセットと同様)。ただし、それらは反復可能です。アイテムを取得する順序に依存することはできません。セットの実装の多くは、同じ要素を同じ順序で反復します。つまり、

scala> Set(1, 2, 3, 4, 5).toList == Set(5, 4, 3, 2, 1).toList
res0: Boolean = true

これは、ここで見ている効果を説明しています。ただし、これに頼るべきではありSetません。上記が当てはまらない完全に有効な実装が存在する可能性があります。

于 2012-06-28T19:25:02.690 に答える
2

ランダムはセットを「シャッフル」します。セットには順序がないため、目に見える効果はありません。REPL は、シャッフルされたセットを毎回同じ方法で出力します。

scala> Set(1,2,3,4,5) 
res29: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)

scala> Set(5,4,3,2,1)
res30: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)

scala> util.Random.shuffle(res30)
res31: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)
于 2015-07-09T18:55:35.940 に答える