如何在Swift中返回Array的前5个对象?

时间:2015-02-15 15:39:50

标签: arrays swift

在Swift中,是否有一种聪明的方法可以使用Array上的高阶方法返回5个第一个对象? 这样做的obj-c方法是保存索引,并循环遍历数组递增索引,直到它为5并返回新数组。有没有办法通过filtermapreduce执行此操作?

12 个答案:

答案 0 :(得分:94)

<强>更新 现在可以使用prefix来获取数组的前n个元素。请查看@mluisbrown's answer以获取有关如何使用前缀的说明。

原始答案: 只需返回您的数组范围,即使没有filtermapreduce,您就可以轻松完成此操作:

var wholeArray = [1, 2, 3, 4, 5, 6]
var n = 5

var firstFive = wholeArray[0..<n] // 1,2,3,4,5

答案 1 :(得分:33)

使用Swift 5,根据您的需要,您可以选择 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(_:)方法

复杂性:如果集合符合RandomAccessCollection,则为O(1);否则,O( k ),其中 k 是从集合开头选择的元素数。

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"]

Apple声明prefix(_:)

  

如果最大长度超过集合中的元素数,则结果包含集合中的所有元素。

#3。使用prefix(upTo:)方法

复杂性:O(1)

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"]

Apple声明prefix(upTo:)

  

使用prefix(upTo:)方法相当于使用部分半开范围作为集合的下标。下标符号优先于prefix(upTo:)

#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(_:)方法

复杂性:如果集合符合RandomAccessCollection,则为O(1);否则,O( k ),其中k是要丢弃的元素数。

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"]

答案 2 :(得分:25)

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]

答案 3 :(得分:15)

SWIFT 4

另一种解决方案:

一个简单的内联解决方案,如果您的阵列太短,不会崩溃

[0,1,2,3,4,5].enumerated().compactMap{ $0.offset < 3 ? $0.element : nil }

但是可以正常使用。

[0,1,2,3,4,5].enumerated().compactMap{ $0.offset < 1000 ? $0.element : nil }

如果您这样做,通常会崩溃:

[0,1,2,3,4,5].prefix(upTo: 1000) // THIS CRASHES

[0,1,2,3,4,5].prefix(1000) // THIS DOESNT

答案 4 :(得分:14)

要获取数组的前5个元素,您需要做的就是对有问题的数组进行切片。在Swift中,你这样做:array[0..<5]

为了使数组的N个第一个元素更具功能性和可推广性,您可以创建一个扩展方法来实现它。例如:

extension Array {
    func takeElements(var elementCount: Int) -> Array {
        if (elementCount > count) {
            elementCount = count
        }
        return Array(self[0..<elementCount])
    }
}

答案 5 :(得分:4)

我略微改变了Markus&#39;回答更新最新的Swift版本,因为不再支持方法声明中的var

extension Array {
    func takeElements(elementCount: Int) -> Array {
        if (elementCount > count) {
            return Array(self[0..<count])
        }
        return Array(self[0..<elementCount])
    }
}

答案 6 :(得分:2)

更新swift 4:

[0,1,2,3,4,5].enumerated().compactMap{ $0 < 10000 ? $1 : nil }

对于swift 3:

[0,1,2,3,4,5].enumerated().flatMap{ $0 < 10000 ? $1 : nil }

答案 7 :(得分:1)

保存数组类型

Swift 4

extension Array {
    func take(_ elementsCount: Int) -> [Element] {
        let min = Swift.min(elementsCount, count)
        return Array(self[0..<min])
    }
}

答案 8 :(得分:1)

简单明了

extension Array {
    func first(elementCount: Int) -> Array {
          let min = Swift.min(elementCount, count)
          return Array(self[0..<min])
    }
}

答案 9 :(得分:0)

对于对象数组,您可以从Sequence中创建扩展。

extension Sequence {
    func limit(_ max: Int) -> [Element] {
        return self.enumerated()
            .filter { $0.offset < max }
            .map { $0.element }
    }
}

用法:

struct Apple {}

let apples: [Apple] = [Apple(), Apple(), Apple()]
let limitTwoAplles = apples.limit(2)

// limitTwoAplles: [Apple(), Apple()]

答案 10 :(得分:0)

快捷键4

要获取Swift数组的前N个元素,可以使用prefix(_ maxLength: Int)

Array(largeArray.prefix(5))

答案 11 :(得分:0)

前缀功能绝对是解决此问题的最有效方法,但是您也可以使用如下所示的for-in循环:

let array = [1,2,3,4,5,6,7,8,9]
let maxNum = 5
var iterationNumber = 0
var firstNumbers = [Int()]
if array.count > maxNum{
  for i in array{
    iterationNumber += 1
    if iterationNumber <= maxNum{
      firstNumbers.append(i)
    }
  }
  firstNumbers.remove(at: 0)
  print(firstNumbers)
} else {
  print("There were not \(maxNum) items in the array.")
}

此解决方案占用了很多行代码,但要检查数组中是否有足够的项来执行程序,然后继续并解决问题。 此解决方案使用许多基本功能,包括array.count,它返回数组中项目的数量,不返回数组中最后一项的位置。它还使用array.append,它将内容添加到数组的末尾。最后,它使用array.remove,它将删除具有指定位置的数组项。

我已经对其进行了测试,它至少可以快速运行5。