在Swift中,获取数组中最后两个元素的最干净的方法是什么?

qlzsbp2j  于 2023-04-10  发布在  Swift
关注(0)|答案(9)|浏览(164)

在Swift中有没有更简洁的方法来获取数组的最后两个元素?一般来说,我尽量避免这种方法,因为它很容易与索引偏离一。(本例使用Swift 1.2)

// Swift -- slices are kind of a hassle?
let oneArray = ["uno"]
let twoArray = ["uno", "dos"]
let threeArray = ["uno", "dos", "tres"]

func getLastTwo(array: [String]) -> [String] {
    if array.count <= 1 {
        return array
    } else {
        let slice: ArraySlice<String> = array[array.endIndex-2..<array.endIndex]
        var lastTwo: Array<String> = Array(slice)
        return lastTwo
    }
}

getLastTwo(oneArray)   // ["uno"]
getLastTwo(twoArray)   // ["uno", "dos"]
getLastTwo(threeArray) // ["dos", "tres"]

我希望有一个更接近Python的便利性的东西。

## Python -- very convenient slices
myList = ["uno", "dos", "tres"]
print myList[-2:] # ["dos", "tres"]
jaql4c8m

jaql4c8m1#

使用Swift 5,根据您的需要,您可以选择以下模式之一,以便从数组的最后两个元素中获取新数组。

#1.使用Array的suffix(_:)

在Swift中,符合Collection协议的对象有一个suffix(_:)方法。Array的suffix(_:)有以下声明:

func suffix(_ maxLength: Int) -> ArraySlice<Element>

返回一个子序列,最大长度为给定的最大长度,其中包含集合的最后一个元素。

  • 用途:*
let array = [1, 2, 3, 4]
let arraySlice = array.suffix(2)
let newArray = Array(arraySlice)
print(newArray) // prints: [3, 4]

#2.使用Arraysubscript(_:)

作为suffix(_:)方法的替代,您可以使用Arraysubscript(_:)下标:

let array = [1, 2, 3, 4]
let range = array.index(array.endIndex, offsetBy: -2) ..< array.endIndex
//let range = array.index(array.endIndex, offsetBy: -2)... // also works
let arraySlice = array[range]
let newArray = Array(arraySlice)
print(newArray) // prints: [3, 4]
shstlldc

shstlldc2#

myList[-2:]
是的,我有一个增强请求,要求负索引符号,我建议你也提交一个。
然而,你不应该让自己更难做到这一点。内置的全局suffix函数正是你想要的:

let oneArray = ["uno"]
let twoArray = ["uno", "dos"]
let threeArray = ["uno", "dos", "tres"]

let arr1 = oneArray.suffix(2) // ["uno"]
let arr2 = twoArray.suffix(2) // ["uno", "dos"]
let arr3 = threeArray.suffix(2) // ["dos", "tres"]

结果是一个切片,但如果需要,您可以将其强制转换为Array。

zujrkrfu

zujrkrfu3#

swift 5中,可以使用suffix从最后一个获取对象,使用prefix从第一个获取对象,下面是一个例子:

let exampleArray = ["first text", "second text", "third text"]

let arr1 = exampleArray.suffix(2) // ["second text", "third text"]
let arr2 = exampleArray.prefix(2) // ["first text", "second text"]

结果是一个切片,但如果需要,您可以将其强制转换为Array。

aurhwmvo

aurhwmvo4#

在Swift 2中,你可以扩展CollectionType。下面是一个例子(借用Rob纳皮耶的答案):

extension CollectionType {
    func last(count:Int) -> [Self.Generator.Element] {
        let selfCount = self.count as! Int
        if selfCount <= count - 1 {
            return Array(self)
        } else {
            return Array(self.reverse()[0...count - 1].reverse())
        }
    }
}

您可以在任何CollectionType上使用它。下面是Array

let array = ["uno", "dos", "tres"]
print(array.last(2)) // [dos, tres]

下面是CharacterView

let string = "looking"
print(string.characters.last(4)) // [k, i, n, g]

(Note我的示例在所有情况下都返回Array,而不是原始集合类型。

hvvq6cgz

hvvq6cgz5#

更一般的答案…

let a1 = [1,2,3,4,5]
let a2 = ["1","2","3","4","5"]

func getLast<T>(array: [T], count: Int) -> [T] {
  if count >= array.count {
    return array
  }
  let first = array.count - count
  return Array(array[first..<first+count])
}

getLast(a1, count: 2) // [4, 5]
getLast(a2, count: 3) // ["3", "4", "5"]
8qgya5xd

8qgya5xd6#

Swift中数组的最后两项
EDIT:首先检查myArray.count〉= 2

let myArray2:Array? = myArray.count >= 2 ? [myArray[myArray.count-2], myArray[myArray.count-1]] : nil

这里它被 Package 在一个函数中,该函数接受数组并返回一个包含最后两个元素的数组,或者如果传递的数组不包含至少两个元素,则返回nil。

func getLastTwo(myArray:[String]) -> [String]? {
        return myArray.count >= 2 ? [myArray[myArray.count-2], myArray[myArray.count-1]] : nil
    }
wbrvyc0a

wbrvyc0a7#

let items = [0, 2, 5, 3, 7, 6, 9, 10]
let count = items.count
let last2 = items[count - 2 ..< count] // [9, 10]
zwghvu4y

zwghvu4y8#

我怀疑它会让你更快乐,但数学肯定更简单:

func getLastTwo(array: [String]) -> [String] {
    if array.count <= 1 {
        return array
    } else {
        return array.reverse()[0...1].reverse()
    }
}

请注意,reverse()是惰性的,所以这不是特别昂贵。

busg9geu

busg9geu9#

Swift4解决方案:

let oneArray = ["uno"]
let twoArray = ["uno", "dos"]
let threeArray = ["uno", "dos", "tres"]

let arr1 = threeArray.suffix(from: threeArray.count-2) // ["dos", "tres"]

其他解释Swift内置函数func suffix(from start: Int) -> ArraySlice<Element>功能的例子有...

let arr2 = oneArray.suffix(from: 0) // ["uno"]
let arr3 = twoArray.suffix(from: 0) // ["uno", "dos"]
let arr4 = twoArray.suffix(from: 1) // ["dos"]
let arr5 = threeArray.suffix(from: 1) // ["dos", "tres"]
let arr6 = threeArray.suffix(from: 2) // ["tres"]

相关问题