【问题标题】:Get last 10 elements from array : NSMakeRange [duplicate]从数组中获取最后 10 个元素:NSMakeRange [重复]
【发布时间】:2017-05-23 07:05:11
【问题描述】:

我需要获取最后 10 个元素或最少 10 个元素和 array.count。在 Objective-C 中,我是这样做的:

Objective-C 代码:

NSRange endRange = NSMakeRange(sortedArray.count >= 10 ? sortedArray.count - 10 : 0, MIN(sortedArray.count, 10));
NSArray *lastElements= [sortedArray subarrayWithRange:endRange];

在 Swift 中我已经做到了:

let endRange = NSMakeRange(values.count >= 10 ? values.count - 10 : 0, min(values.count , 10) )

但不知道如何在 swift 中使用此范围获取数组。任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • “数组中的 swift last elements”在 Google 上的热门搜索——例如,Swift 2/3 代码在此答案 stackoverflow.com/a/33279008/1187415 中复制。
  • 让 sortedArray:NSArray = [150,125,115,100,90,80,70,60,50,40,30,20,15]; let endRange = NSMakeRange(sortedArray.count >= 10 ? sortedArray.count - 10 : 0, min(sortedArray.count , 10) ) as NSRange let result = sortedArray.subarray(with: endRange) print("结果是: (result )")

标签: ios arrays swift


【解决方案1】:

您可以使用数组实例方法suffix(_:)。请注意,使用后缀您不需要检查数组计数。从数组末尾开始最多需要 10 个元素。

let array = Array(1...100)   // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]

let lastTenElements = Array(array.suffix(10))   // [91, 92, 93, 94, 95, 96, 97, 98, 99, 100]

【讨论】:

  • 你的解决方案更好。
  • 感谢您提供的替代方法,它正在正常工作。只是一个问题如果数组是10,000会影响效率
  • 这是正确的做法。您不必担心效率
  • 感谢您的代码!
【解决方案2】:

你可以通过声明Range得到它:

let letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"]

let desiredRange = letters.index(letters.endIndex, offsetBy: -10) ..< letters.endIndex

// ["e", "f", "g", "h", "i", "j", "k", "l", "m", "n"]
let lastTenLetters = (desiredRange.count > letters.count) ? letters : Array(letters[desiredRange])

请注意,如果所需范围的计数大于主数组的计数,则最后十个元素应该是整个主数组。

虽然我仍然同意 Leo's answer 适合您的情况,但我想提一下,这个解决方案的好处是它不仅适用于最后一个元素,为了清楚起见,请考虑您想要在第一个元素之后获得10个元素(参考letters数组,元素应该是b-k),通过实现一个期望的范围,你可以实现这个,如下:

let letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"]

let desiredRange = letters.index(letters.startIndex, offsetBy: 1) ..< letters.index(letters.startIndex, offsetBy: 11)

// ["b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
let lastTenLetters = (desiredRange.count > letters.count) ? letters : Array(letters[desiredRange])

【讨论】:

  • 如果数组的元素少于 10 个,这会使应用程序崩溃
  • @LeoDabus 你是对的,我编辑了它......但我认为在我的代码 sn-p 中它不仅应该适用于最后一个元素,请协助。仍然认为对于最后一个元素,你的答案是正确的,我投了赞成票:)
【解决方案3】:

变量值:NSArray = [1,2,3,4,5,6,7,8,9,10,11]

    values = values.reversed() as NSArray

    let tenDigits = values.prefix(10)

    debugPrint(values.count >= 10 ? NSArray(array: (Array(tenDigits))) : min(values.count , 10))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2021-03-14
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多