あなたのリストを列挙する:あなたは、配列をシャッフルインデックスにそれをソートし、その後、再びそれをシャッフルすることができます
let songs = [1, 3, 6, 8, 2, 4, 0]
var enumerated = Array(songs.enumerated())
// [(offset: 0, element: 1), (offset: 1, element: 3), (offset: 2, element: 6), (offset: 3, element: 8), (offset: 4, element: 2), (offset: 5, element: 4), (offset: 6, element: 0)]
enumerated.shuffle()
// [(offset: 1, element: 3), (offset: 4, element: 2), (offset: 2, element: 6), (offset: 5, element: 4), (offset: 0, element: 1), (offset: 6, element: 0), (offset: 3, element: 8)]
enumerated.sort { $0.offset < $1.offset }
// [(offset: 0, element: 1), (offset: 1, element: 3), (offset: 2, element: 6), (offset: 3, element: 8), (offset: 4, element: 2), (offset: 5, element: 4), (offset: 6, element: 0)]
この方法です。シャッフルされていないコピーを保持して、適切なインデックスで開始することもできます。
代わりに、インデックスのを作成してシャッフルしてから、それを通過してArray
の適切な場所から再生する曲を選択することもできます。そして、あなたがする必要がある場合のシーケンスまたは他の方法を増やすことで曲を再生するに切り替える:
var playOrder = Array(0..<songs.count)
playOrder.shuffle()
for current in playOrder {
playSong(index: playOrder[current])
}
(もちろん、私はあなたがshuffle()
方法を有することがArray
を高めてい仮定しています。)
だからあなたの内側shuffleSwitchは、すべての曲をスタックに挿入することはできません。そのようにして再度unshuffleすると、スタックの上から最新の曲を得ることができます。また、キューを使用することもできます。 – zenwraight
2つの別々のコンテナあなたがシャッフルに使うことができる普通のものと1つの曲のために。 –
ここで定義する必要があるのは、「通常の」という意味です。ノーマルがソング名でアルファベット順である場合は、ソングをアンシャッフルするアルファベット順ソートを実行するだけです。 – paulvs