Created
June 5, 2015 14:50
-
-
Save sketchytech/4b015bd54411f3d821a9 to your computer and use it in GitHub Desktop.
Swift: Spreadsheet Row Sorting
This file contains 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
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