перемешать массив после индекса - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь перетасовать массив после определенного индекса, я сделал с механизмом разделения / объединения, но есть ли эффективный способ?

Пример:

var arr = [0,1,2,3,4,5,6,7,8,9]


arr.shuffle(after index:4)
print(arr) -> //[0,1,2,3,4,7,9,8,6]

arr.shuffle(after index:0)
print(arr) -> //[0,3,2,1,4,9,8,6,8]

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018
extension Array {
    mutating func shuffle(fromIndex:Int) {
        self[fromIndex...].shuffle()
    }

    func shuffled(fromIndex:Int) -> [Element]{
        return self[..<fromIndex] + self[fromIndex...].shuffled()
    }
}

var arr = [0,1,2,3,4,5,6,7,8,9]
arr.shuffle(fromIndex: 4) // 0,1,2,3,x,x,x,x,x,x - x - any of the value of 4...9

let arr2 = [0,1,2,3,4,5,6,7,8,9]
var arr3 = arr2.shuffled(fromIndex: 4)

Для mutating func shuffle(fromIndex:Int) для работы массив должен быть var.Это не будет работать с let.func shuffled(fromIndex:Int) -> [Any] - для перемешанной копии массива let

0 голосов
/ 12 декабря 2018

shuffle() - это метод протокола MutableCollection, поэтому его можно применять к массиву slice. Пример:

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr[5...].shuffle() // Shuffle elements from index 5 to the end
print(arr) // [0, 1, 2, 3, 4, 6, 8, 7, 5, 9]
...