订购 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()
}
我有 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()
}