Эффективный способ уменьшения массива через децимацию?
Я пытаюсь уменьшить длину длинного массива путем удаления или извлечения каждого 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]