订购 NSDate 数组。 Swift 2

Ordering NSDate Array. Swift 2

我有 1 个日期数组和 1 个保存值的二维数组。

例如:

func orderArrays() {
    var dateArray : [NSDate] = []
    var values : [[Double]] = [[]]
    dateArray = [01-01-2016, 02-01-16, 08-01-16, 03-01-2016]
    values = [[2.0, 4.6, 5.6, 3.8], [7.2, 6.4, 1.6, 7.2]]
 }

values[0][0] &values[1][0] 表示 dateArray[0].

的值

我需要订购 dateArray(最早的第一个),它也会相应地重新订购这些值。

例如,最终数组如下所示:

dateArray = [01-01-2016, 02-01-16, 03-01-2016, 08-01-16]
values = [[2.0, 4.6, 3.8, 5.6], [7.2, 6.4, 7.2, 1.6]]

dateArray[3] 现在是 dateArray[2],这导致 values[0][3] 现在是 values[0][2] & values[1][3] 现在是 values[1][2]

最终数组需要看起来像这样,因为我正在使用这些数据来创建图表。我将始终有 2 个数组,但是值内的内部数组可以是无限的(不总是 2 个)

备选方案 1:更改您的数据结构

您的结构有待加强。例如,你可以这样保存你的数据(我也将日期设置为字符串,通常你必须使用 NSDateFormatter 将它们转换为 NSDate):

var dateValueArray: [(date: NSDate, values: [Double])]
dateValueArray = [(date: "01-01-2016", values: [2.0, 7.2]),
                  (date: "02-01-2016", values: [4.6, 6.4]),
                  (date: "08-01-2016", values: [5.6, 3.8]),
                  (date: "03-01-2016", values: [3.8, 7.2])]

该结构可以这样排序:

let sortedArray = dateValueArray.sort { [=11=].date.compare(.date) == NSComparisonResult.OrderedAscending }

备选方案 2:对结构进行排序

您的初始结构可以这样排序:

1:对数据进行排序

let sortedArray = Zip2Sequence(dateArray, Zip2Sequence(values[0], values[1])).sort({ [=12=].0.compare(.0) == NSComparisonResult.OrderedAscending })

2:将生成的数据结构((date, (value0, value1)))转换回初始数据结构并将其分配给数组:

dateArray = sortedArray.reduce([], combine: {[=13=] + [.0]})
let values0 = sortedArray.reduce([], combine: {[=13=] + [.1.0]})
let values1 = sortedArray.reduce([], combine: {[=13=] + [.1.1]})
values = [values0, values1]

它使用 NSDate 数据对数组进行排序。如果您记得元素在数组中的先前位置,您只需更改它即可获得新位置。我做了类似的事情,但在你的情况下我用 Dictionary 替换了数组我会使用:

var dictionary = [NSDate : Array<Array<CGFloat>>]()

        var dateArray : [NSDate] = []
        var values : [[Double]] = [[]]

        let dateformatter = NSDateFormatter()
        dateformatter.dateFormat = "dd-MM-yyyy"
        //creating the dates
        for i in 1 ..< 10{
            let date = dateformatter.dateFromString("01-0\(10-i)-2016")
            dateArray.append(date!)
        }
        let sortedArray = dateArray.sort({[=10=].compare() == NSComparisonResult.OrderedAscending })

我使用下面的方法得到了所需的答案。

我创建了一个排序数组,并创建了一个包含排序格式的原始日期索引的数组。然后使用相同的索引顺序对值数组进行排序。

 let sortedArray = dateArray.sort { [=10=].compare() == NSComparisonResult.OrderedAscending }

    var indexOfDates : [Int] = []

    for i in sortedArray {
        let index = dateArray.indexOf(i)
        indexOfDates.append(index!)
    }
    var sortedTotalSpent : [[Double]] = [[0.0]]
    var sortedSpend : [Double] = [0.0]
    sortedTotalSpent.removeAll()
    sortedSpend.removeAll()

    for i in value {
        for x in indexOfDates {
            print("i = \(i)")
            print("x = \(x)")
            print("i[x] = \(i[x])")
            sortedSpend.append(i[x])
        }
        sortedTotalSpent.append(sortedSpend)
        sortedSpend.removeAll()
    }