繁体   English   中英

数组改组后,如何使其再次“改组”

[英]After shuffle an array how to make it “unshuffled” again

我正在做音乐播放器。 因此,单击“切换”后,它会随机播放歌曲。 而且在我再次单击“切换”后,它应该可以正常播放。 如何再次正常播放歌曲。 (我可以尝试清除阵列。然后再次创建相同的阵列。它可能起作用。但是我不知道如何保持最后一首歌曲。)那么,有没有一种简单的方法可以在普通行中再次播放歌曲?

   var ifshuffled=0
@IBAction func shuffleSwitch(_ sender: Any)
{
    ifshuffled += 1
        if ifshuffled % 2 == 0
    {
        //playnormal
    }

    else
    {
        songs.shuffle()
    }
}

列举您的清单:

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 ,将其随机排列,然后遍历索引,然后从Array的相应位置选择要播放的歌曲。 然后在需要时切换为以递增顺序或任何其他方式播放歌曲:

var playOrder = Array(0..<songs.count)
playOrder.shuffle()
for current in playOrder {
  playSong(index: playOrder[current])
}

(当然,我假设您已将Array扩展为具有shuffle()方法。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM