我有双打数组:
var dates: [Double] = [1542412800000,
1542499200000,
1543017600000,
1543708800000,
1544659200000,
1547164800000,
1550880000000]
(是的,它实际上是日期时间戳)。我想要的是将其转换为百分比数组。例如,如果我有一个[5,20,25]数组,我希望输出[0.20,0.8,1],即当前值的百分比。我结束了:
let percentages: [Double] = dates
.map{$0 - dates.first!}
.map{$0/dates.last!}
percentages.forEach{ it in
print(it)
}
但是输出是:
0.0
5.5710306406685235e-05
0.00038997214484679665
0.0008356545961002785
0.0014484679665738162
0.003064066852367688
0.005459610027855153
第二值有点奇怪。该如何解决?
答案 0 :(得分:2)
在将每个值除以最后一个map语句中的最后一个值时,您将忽略一个事实,即所有内容均已被第一个值减去。
要解决此问题,应除以值的范围(最大值和最小值之差)。
假设您的数组已排序,则为:
guard let maxValue = dates.last, let minValue = dates.first else {
return
}
let percentages = dates
.map {$0 - minValue}
.map {$0 / (maxValue - minValue)}
这将规范化所有值,使得第一个值为0,最后一个值为1,其他所有值都介于两者之间。
如果您不想将第一个值标准化为0(但将所有值都保持在0和1之间),则可以省略减法步骤:
let percentages = dates.map {$0 / maxValue}
如果未对数组进行排序,则可以使用数组的.min()
和.max()
函数:
guard let maxValue = dates.max(), let minValue = dates.min() else {
return
}
答案 1 :(得分:2)
您可以这样操作:
let dates: [Double] = [1542412800000,
1542499200000,
1543017600000,
1543708800000,
1544659200000,
1547164800000,
1550880000000]
let sorted = dates.sorted()
guard let first = sorted.first,
let last = sorted.last,
last != first
else {
fatalError()
}
let denominator = last - first
let percentages = sorted.map { ($0 - first)/denominator }
print(percentages) //[0.0, 0.01020408163265306, 0.07142857142857142, 0.15306122448979592, 0.2653061224489796, 0.5612244897959183, 1.0]
答案 2 :(得分:1)
使用您的代码样式,您应该使用以下代码:
var dates: [Double] = [1542412800000,
1542499200000,
1543017600000,
1543708800000,
1544659200000,
1547164800000,
1550880000000]
let intermediate: [Double] = dates
.map{$0 - dates.first!}
let percentages = intermediate
.map{$0/intermediate.last!}
percentages.forEach{ it in
print(it)
}
真正的问题是您将每个元素除以“初始”最大值(而不是最小值)。