Skip to content

Instantly share code, notes, and snippets.

@kmussel
Created July 11, 2016 18:11
Show Gist options
  • Save kmussel/7c5ba251c0a6c1f254f84d7ef072041b to your computer and use it in GitHub Desktop.
Save kmussel/7c5ba251c0a6c1f254f84d7ef072041b to your computer and use it in GitHub Desktop.
swift sorting
struct Favorite : CustomStringConvertible{
let ID: Int!
let name: String!
let category: Category!
// CustomStringConvertible conformance
var description : String {
return name
}
}
typealias Category = String
struct FavoritesDisplayAssistant {
/*
* Arguments:
* favorites: an array of favorites
* Return:
* It returns a sorted list of Tuples with elements (Category, [Favorite])
* the Tuples are sorted alphabetically by Category
* The Favorites inside the Tuples are each sorted alphabetically by name
*/
static func sortForDisplay(favorites: [Favorite]) -> [(Category, [Favorite])] {
// your code here
var sortedFavs = [Category: [Favorite]]()
let sortedArray = favorites.sort({
$0.name < $1.name
})
for fav in sortedArray {
if var val = sortedFavs[fav.category] {
val.append(fav)
sortedFavs[fav.category] = val
}else {
sortedFavs[fav.category] = [fav]
}
}
let favsorted = sortedFavs.sort{ $0.0 < $1.0 }
return favsorted
}
/*
* Arguments
* -favorites: array of favorites that may or may not already exist in Tuples
* -tuples: array of (Category, Favorite) tuples that may or may not be sorted
*
* Return
* It returns a sorted list of Tuples with elements (Category, [Favorite])
* the Tuples are sorted alphabetically by Category
* The Favorites inside the Tuples are each sorted alphabetically by name
*
* Hint: favorites are considered the 'same' if their ID's are equal
*/
static func addNew(favorites: [Favorite], toTuples tuples: [(Category, [Favorite])]) -> [(Category, [Favorite])] {
// your code here
let fm = tuples.flatMap { $0.1 }
var allfavs = [Favorite](favorites)
for c in fm {
if(!favorites.contains { $0.ID == c.ID }) {
allfavs.append(c)
}
}
return sortForDisplay(allfavs)
}
}
let favorite1 = Favorite(ID: 1, name: "Dojo", category: "Gym")
let favorite2 = Favorite(ID: 2, name: "Orange Theory", category: "Gym")
let favorite3 = Favorite(ID: 3, name: "Equinox", category: "Gym")
let favorite4 = Favorite(ID: 4, name: "Solidcore", category: "Gym")
let favorite5 = Favorite(ID: 5, name: "Trader Joe's", category: "Grocery")
let favorite6 = Favorite(ID: 6, name: "Whole Foods", category: "Grocery")
let favorite7 = Favorite(ID: 7, name: "Safeway", category: "Grocery")
let favorite8 = Favorite(ID: 8, name: "Chipotle", category: "Restaurant")
let favorite9 = Favorite(ID: 9, name: "Subway", category: "Restaurant")
let favorite10 = Favorite(ID: 10, name: "Capital Grill", category: "Restaurant")
// creating assistant -- example usage starts here!
// let unsorted = [grocerCategory,gymCategory,restaurantCategory]
let unsorted = [favorite1,favorite2,favorite3,favorite4,favorite5,favorite6,favorite7,favorite8,favorite9,favorite10]
let sorted = FavoritesDisplayAssistant.sortForDisplay(unsorted)
let favorite11 = Favorite(ID: 11, name: "Jamba Juice", category: "Juicery")
let favorite12 = Favorite(ID: 6, name: "Whole Foods", category: "Upscale Grocery")
let favorite13 = Favorite(ID: 13, name: "Crunch", category: "Gym")
let newSorted = FavoritesDisplayAssistant.addNew([favorite11,favorite12,favorite13], toTuples: sorted)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment