Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get last 10 elements from array : NSMakeRange [duplicate]

Tags:

arrays

ios

swift

I need to get last 10 elements or min of 10 and array.count. In objective-C I have done it like this :

Objective-C code :

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

In Swift I have done this :

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

But don't know how to get the array using this range in swift. Any help would be appreciated. Thanks.

like image 704
Sharad Chauhan Avatar asked May 23 '17 07:05

Sharad Chauhan


2 Answers

You can use Array Instance Method suffix(_:). Note that using suffix you don't need to check your array count. It will take up to 10 elements from the end of your array.

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]
like image 58
Leo Dabus Avatar answered Oct 10 '22 03:10

Leo Dabus


You can get it by declaring 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])

Note that if the desired range's count is more than the main array's count, the last ten elements should be the whole main array.

Although I still agree that Leo's answer is the proper one for your case, I would like to mention that the good thing about this solution is that it is applicable for not only last element, to make it clear, consider that you want to get 10 elements after the first one (referring to letters array, elements should be b-k), by implementing a desired range, you could achieve this, as follows:

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])
like image 30
Ahmad F Avatar answered Oct 10 '22 02:10

Ahmad F