Created
November 20, 2015 16:24
-
-
Save odrobnik/886101de071bdef21396 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
for page in pages ?? [] | |
{ | |
guard let pageNumber = page.pageNumber | |
else { continue } | |
if let array = pageLookup[pageNumber] | |
{ | |
pageLookup[pageNumber] = array + [page] | |
} | |
else | |
{ | |
pageLookup[pageNumber] = [page] | |
} | |
} | |
let result = pageLookup.sort { $0.0 < $1.0 }.map { (pageNumber, pageArray) -> [Page] in | |
return pageArray.sort { $0.roundNumber < $1.roundNumber && $0.variantNumber < $1.variantNumber } | |
} |
mrubin
commented
Nov 20, 2015
You can actually take it one step further.. no need to construct the dictionary:
struct Page {
var pageNumber: Int?
var roundNumber: Int?
var variantNumber: Int?
}
let pages: [Page] = [
Page(pageNumber: 1, roundNumber: 1, variantNumber: 1),
Page(pageNumber: 3, roundNumber: 3, variantNumber: 3),
Page(pageNumber: 2, roundNumber: 2, variantNumber: 2)
]
let uniquePageNumbers = Array(Set(pages.flatMap({ $0.pageNumber }))).sort(<)
let result = uniquePageNumbers.map { pageNumber in
pages.filter { $0.pageNumber == pageNumber }.sort { $0.roundNumber < $1.roundNumber && $0.variantNumber < $1.variantNumber }
}
And, because we can - not because it's a good idea :) - the whole thing as a one-liner:
let result = Array(Set(pages.flatMap({ $0.pageNumber }))).sort(<).map({ (pageNumber: Int) in pages.filter({ (page: Page) in page.pageNumber == pageNumber }).sort({ (a: Page, b: Page) in a.roundNumber < b.roundNumber && a.variantNumber < b.variantNumber }) })
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment