Эффективный способ уменьшения массива через децимацию?

Я пытаюсь уменьшить длину длинного массива путем удаления или извлечения каждого X-го элемента.

Вот что я получил за расширение моего массива:

func downsampled(to threshold: Int) -> [T] {
    // Validate that threshold falls in valid range
    guard !isEmpty, 1...count ~= threshold else { return Array(self) }

    let skip = (count / threshold) + 1
    var index = 0

    var items = [T]()
    while index < count {
        items.append(self[index])
        index += skip
    }

    return items
}

Я ожидаю 50-100 тыс. Элементов в исходном массиве и, вероятно, уменьшу до исходной ширины границ экрана (500-1 тыс. Точек).

Есть ли более краткий или эффективный способ сделать это?

1 ответ

Решение

Это, вероятно, не более эффективно, но я думаю, что было бы более кратким использовать для шага (от:, до:, by:), следующим образом:

extension Array {
    func every(nth: Int) -> Array {
        var result: Array = []
        stride(from: 0, to: count, by: nth).forEach { result.append(self[$0]) } 
        return result
    }
}

Тестирование игровой площадки

let array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15].every(nth: 2)
array  //  [1, 3, 5, 7, 9, 11, 13, 15]
Другие вопросы по тегам