Swift 多对象类型、多维数组、可变顺序的快速排序

Swift 多对象类型、多维数组、可变顺序的快速排序,swift,Swift,我正在尝试对一个数组进行排序,该数组包含多个包含字符串、日期和其他数字的记录。我希望能够有多达4列排序的基础上,第1,第2,第3和第4选择与升序/降序选项。基于其他示例,我能够实现这一目标,但仅限于作为字符串排序 代码将对字符串数组进行排序,但由于某些字符串是数字和日期,因此排序不符合要求。我想使用.localizedStandardComare方法进行排序,但我不知道如何将其合并到数组的代码中 import UIKit import PlaygroundSupport class MyVie

我正在尝试对一个数组进行排序,该数组包含多个包含字符串、日期和其他数字的记录。我希望能够有多达4列排序的基础上,第1,第2,第3和第4选择与升序/降序选项。基于其他示例,我能够实现这一目标,但仅限于作为字符串排序

代码将对字符串数组进行排序,但由于某些字符串是数字和日期,因此排序不符合要求。我想使用.localizedStandardComare方法进行排序,但我不知道如何将其合并到数组的代码中

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {

var array = [["a","e","def","ttt","",""],["z","2019/5/28","ccc","123",""], ["z","2019/10/23","def","567",""]]
// Constants below are assigned based on optional ascending/descending choice
let a1 = 4  // dummy column
let a2 = 0  // descending order for column 0
let b1 = 1  // ascending order for column 1
let b2 = 4  // dummy column
let sorted = array.sorted(by: {($0[a1],$1[a2],$0[b1],$1[b2]) < ($1[a1],$0[a2],$1[b1],$0[b2])})
print("sorted array=", sorted)

// The results below show that columns 0 and 1 are sorted correctly as strings, but column 1 needs to be sorted as date similar to what this closure would achieve for a simpler array
// --> {$0.localizedStandardCompare($1) == orderedAscending}

sorted array= [["z", "2019/10/23", "def", "567", ""], ["z", "2019/5/28", "ccc", "123", ""], ["a", "e", "def", "ttt", "", ""]]
导入UIKit
导入PlaygroundSupport
类MyViewController:UIViewController{
变量数组=[“a”、“e”、“def”、“ttt”、“z”、“2019/5/28”、“ccc”、“123”和[“z”、“2019/10/23”、“def”、“567”和“]”]
//下面的常量是根据可选的升序/降序选项指定的
设a1=4//虚拟列
设a2=0//列0的降序
设b1=1//列1的升序
设b2=4//伪列
设sorted=array.sorted(按:{($0[a1],$1[a2],$0[b1],$1[b2])<($1[a1],$0[a2],$1[b1],$0[b2]))
打印(“排序数组=,排序)
//下面的结果显示,列0和列1被正确地排序为字符串,但是列1需要被排序为日期,类似于此闭包对于更简单的数组所能实现的
//-->{$0.localizedStandardCompare($1)==orderedAscending}
排序数组=[“z”,“2019/10/23”,“def”,“567”,““”],[“z”,“2019/5/28”,“ccc”,“123”,““”],[“a”,“e”,“def”,“ttt”,““”],“”]]

下面是使用结构数组编写的新工作代码。更多代码,但我怀疑可以更有效地编写:

var array = [["asdf","45","10/3/2019","100.34",""],["asdf","100","6/12/2019","12.3",""],["asdf","10","12/16/2019","5.67",""],["asdf2","450","4/3/2019","923",""],["asdf3","9","5/20/2019","567",""]]

struct arrayStruct {
    var stringV : String!
    var intV : Int!
    var dateV : Date!
    var costV : Float!
    var stringD : String!
}
var newArray = [arrayStruct]()
let dateFormatter = DateFormatter()
for i in 0 ..< array.count {
        let rowArray = array[i]
        let rowInt = Int(rowArray[1])
        let rowDate = dateFormatter.date(from: rowArray[2])
        let rowCost = Float(rowArray[3])
        newArray.append(arrayStruct(stringV: rowArray[0], intV: rowInt!, dateV: rowDate!, costV: rowCost!, stringD: rowArray[4]))
        }
newArray.sort(by: {($0.stringV, $0.dateV) < ($1.stringV, $1.dateV)})
    print("New Sorted Array:")
    for i in 0 ..< newArray.count {
        print("col0=",newArray[i].stringV!, " col2=",newArray[i].dateV!)
    }

Result: 
New Sorted Array:
col0= asdf  col2= 2019-06-12 04:00:00 +0000
col0= asdf  col2= 2019-10-03 04:00:00 +0000
col0= asdf  col2= 2019-12-16 05:00:00 +0000
col0= asdf2  col2= 2019-04-03 04:00:00 +0000
col0= asdf3  col2= 2019-05-20 04:00:00 +0000
var数组=[[“asdf”、“45”、“2019年10月3日”、“100.34”、“asdf”、“100”、“2019年6月12日”、“12.3”、“12.3”、“2019年12月16日”、“5.67”、“5.67”、“2019年4月3日”、“923”、“2019年5月20日”、“567”、“9”]
结构阵列结构{
var-stringV:String!
var intV:Int!
var dateV:日期!
var costV:浮动!
var String:String!
}
var newArray=[arrayStruct]()
让dateFormatter=dateFormatter()
对于0中的i..
从使用结构数组开始。这将使事情变得更加简单。为了澄清,您是说“localizedStandardCompare”函数不可能应用于“sorted”吗我的代码中的方法语句?如果是,那太糟糕了。一行程序非常简单,可以进行多列排序,但只能使用默认比较。我使用了结构进行排序,如下面的答案所示。但是我无法选择排序变量,以便排序语句可以基于用户选择。如果一个排序语句,如$x.choice1<$y.choice1,其中可以是x,y,choice1可以是基于用户输入的变量。是否有声明这些变量的方法?如果没有,对于大型colunm数组,会有大量冗余的If语句。