Как вернуть первые 5 объектов массива в Swift?



в Swift, есть ли умный способ использовать методы более высокого порядка на массиве, чтобы вернуть 5 первых объектов?
Способ obj-c для этого сохранял индекс, А for-loop через массив увеличивал индекс до 5 и возвращал новый массив. Есть ли способ сделать это с помощью filter,map или reduce?

489   9  

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 введите или передайте его методу, который ожидает Array param вам нужно будет заставить результат в 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

    Ничего не найдено.