Skip to content

Instantly share code, notes, and snippets.

@sketchytech
Created June 5, 2015 14:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sketchytech/4b015bd54411f3d821a9 to your computer and use it in GitHub Desktop.
Save sketchytech/4b015bd54411f3d821a9 to your computer and use it in GitHub Desktop.
Swift: Spreadsheet Row Sorting
import UIKit
enum Field:Comparable {
case Number(Double)
case Str(String)
func num() -> Double? {
switch self {
case .Number(let num):
return num
default:
return nil
}
}
func str() -> String? {
switch self {
case .Str(let str):
return str
default:
return nil
}
}
}
func ==(x: Field, y: Field) -> Bool {
if let n1 = x.num(),
n2 = y.num() {
return n1 == n2
}
else if let s1 = x.str(),
s2 = y.str() {
return s1 == s2
}
return false
}
func <(x: Field, y: Field) -> Bool {
if let n1 = x.num(),
n2 = y.num() {
return n1 < n2
}
else if let s1 = x.str(),
s2 = y.str() {
return s1 < s2
}
return false
}
var aFieldList = [Field.Str("hello"), Field.Number(12), Field.Str("apple"), Field.Str("pair"), Field.Number(10)]
var sortedStrings = sorted(filter(aFieldList){$0.str() != nil})
var sortedNumbers = sorted(filter(aFieldList){$0.num() != nil})
aFieldList = [sortedStrings,sortedNumbers].flatMap{$0}
struct Column {
var fields:[Field]
init(fields:[Field]) {
self.fields = fields
}
mutating func sort() {
let sortedStrings = sorted(filter(fields){$0.str() != nil})
let sortedNumbers = sorted(filter(fields){$0.num() != nil})
fields = [sortedStrings,sortedNumbers].flatMap{$0}
}
}
struct Table {
var columns:[Column]
init (columns:[Column]) {
self.columns = columns
}
private func secondarySorted(arr1:Column, var arr2:Column) -> Column {
let rows = arr1.fields.reverse().map{(object1:$0, object2:arr2.fields.removeLast())}
var filteredStrings = rows.filter{$0.object1.str() != nil}
var filteredNumbers = rows.filter{$0.object1.num() != nil}
filteredStrings.sort({$0.object1 < $1.object1})
filteredNumbers.sort({$0.object1 < $1.object1})
let sortedRows = [filteredStrings,filteredNumbers]
return Column(fields:sortedRows.flatMap{$0.map{$0.object2}})
}
mutating func sortColumnsByColumn(ind:Int) {
let sortingColumn = columns[ind]
columns = columns.map{self.secondarySorted(sortingColumn,arr2: $0)}
}
}
let fieldArray1 = [Field.Number(8), Field.Str("pear"), Field.Str("apple"), Field.Str("shoes"), Field.Number(10)]
let fieldArray2 = [Field.Number(8), Field.Number(12), Field.Str("apple"), Field.Str("pair"), Field.Number(10)]
let column1 = Column(fields: fieldArray2)
let column2 = Column(fields: fieldArray1)
var tab = Table(columns: [column1,column2])
tab.sortColumnsByColumn(0)
// now all columns are sorted
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment