Как вернуть первые 5 объектов массива в Swift?
в Swift, есть ли умный способ использовать методы более высокого порядка на массиве, чтобы вернуть 5 первых объектов?
Способ obj-c для этого сохранял индекс, А for-loop через массив увеличивал индекс до 5 и возвращал новый массив. Есть ли способ сделать это с помощью filter,map или reduce?
9 ответов:
безусловно, самый аккуратный способ получить первые N элементов быстрого массива-это использовать
prefix(maxLength: Int):let someArray = [1, 2, 3, 4, 5, 6, 7] let first5 = someArray.prefix(5) // 1, 2, 3, 4, 5это имеет преимущество быть безопасными границами. Если счет вы переходите к
prefixбольше, чем количество массивов, то он просто возвращает весь массив.Примечание: как указано в комментариях,
Array.prefixна самом деле возвращаетArraySlice, а неArray. В большинстве случаев это не должно иметь значения, но если вам нужно назначить результатArrayвведите или передайте его методу, который ожидаетArrayparam вам нужно будет заставить результат вArrayтип:let first5 = Array(someArray.prefix(5))
обновление: Теперь есть возможность использовать
prefixполучить первые n элементов массива. Проверьте @mluisbrown это для объяснения, как использовать префикс.Оригинальный Ответ: Вы можете сделать это очень легко без
filter,mapилиreduceпросто возвращая диапазон вашего массива:var wholeArray = [1, 2, 3, 4, 5, 6] var n = 5 var firstFive = wholeArray[0..<n] // 1,2,3,4,5
let a: [Int] = [0, 0, 1, 1, 2, 2, 3, 3, 4] let b: [Int] = Array(a.prefix(5)) // result is [0, 0, 1, 1, 2]
С Swift 4, в соответствии с вашими потребностями, вы можете выбрать один из 6 следующие коды детской площадки для того, чтобы решить вашу проблему.
#1. Используя
subscript(_:)Нижний индексlet array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"] let arraySlice = array[..<5] //let arraySlice = array[0..<5] // also works //let arraySlice = array[0...4] // also works //let arraySlice = array[...4] // also works let newArray = Array(arraySlice) print(newArray) // prints: ["A", "B", "C", "D", "E"]
#2. Используя
prefix(_:)методlet array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"] let arraySlice = array.prefix(5) let newArray = Array(arraySlice) print(newArray) // prints: ["A", "B", "C", "D", "E"]
#3. Используя
prefix(upTo:)методlet array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"] let arraySlice = array.prefix(upTo: 5) let newArray = Array(arraySlice) print(newArray) // prints: ["A", "B", "C", "D", "E"]
#4. Используя
prefix(through:)методlet array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"] let arraySlice = array.prefix(through: 4) let newArray = Array(arraySlice) print(newArray) // prints: ["A", "B", "C", "D", "E"]
#5. Используя
removeSubrange(_:)методАсимптотика: O(n), где n - это длина коллекции.
var array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"] array.removeSubrange(5...) print(array) // prints: ["A", "B", "C", "D", "E"]
#6. Используя
dropLast(_:)методАсимптотика: O(n), где n - это количество элементов для удаления.
let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"] let distance = array.distance(from: 5, to: array.endIndex) let arraySlice = array.dropLast(distance) let newArray = Array(arraySlice) print(newArray) // prints: ["A", "B", "C", "D", "E"]
для получения первых 5 элементов массива, все, что вам нужно сделать, это нарезать массив. В Swift, вы делаете это так:
array[0..<5].чтобы сделать выбор N первых элементов массива немного более функциональным и обобщаемым, вы можете создать метод расширения для этого. Например:
extension Array { func takeElements(var elementCount: Int) -> Array { if (elementCount > count) { elementCount = count } return Array(self[0..<elementCount]) } }
SWIFT 4
другое решение:
простое встроенное решение, которое не будет сбой, если Ваш массив слишком короткий
[0,1,2,3,4,5].enumerated().compactMap{ .offset < 3 ? .element : nil }но отлично работает с этим.
[0,1,2,3,4,5].enumerated().compactMap{ .offset < 1000 ? .element : nil }обычно это будет сбой, если вы сделали это:
[0,1,2,3,4,5].prefix(upTo: 1000) // THIS CRASHES [0,1,2,3,4,5].prefix(1000) // THIS DOESNT
обновление для swift 4:
[0,1,2,3,4,5].enumerated().compactMap{ < 10000 ? : nil }для swift 3:
[0,1,2,3,4,5].enumerated().flatMap{ < 10000 ? : nil }
Я немного изменил ответ Маркуса, чтобы обновить его для последней версии Swift, как
varвнутри вашего метода объявление больше не поддерживается:extension Array { func takeElements(elementCount: Int) -> Array { if (elementCount > count) { return Array(self[0..<count]) } return Array(self[0..<elementCount]) } }
Swift 4 С сохранением типов массивов
extension Array { func take(_ elementsCount: Int) -> [Element] { let min = Swift.min(elementsCount, count) return Array(self[0..<min]) } }
Comments