Skip to content

Instantly share code, notes, and snippets.

@odrobnik
Created November 20, 2015 16:24
Show Gist options
  • Save odrobnik/886101de071bdef21396 to your computer and use it in GitHub Desktop.
Save odrobnik/886101de071bdef21396 to your computer and use it in GitHub Desktop.
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
Copy link

mrubin commented Nov 20, 2015

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(<)

var pageLookup: [Int: [Page]] = [:]
uniquePageNumbers.forEach { (pageNumber: Int) in
    pageLookup[pageNumber] = pages.filter { $0.pageNumber == pageNumber }
}

let result = uniquePageNumbers.map { pageLookup[$0]!.sort({ $0.roundNumber < $1.roundNumber && $0.variantNumber < $1.variantNumber }) }

@mrubin
Copy link

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 }
}

@mrubin
Copy link

mrubin commented Nov 20, 2015

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