我有一系列年龄。
我想通过年龄值将数组拆分为4个子数组。
A - > 0 ... 25
B - > 26 ... 50
c - > 51 ... 75
d - > 76 +
迭代数组并按年龄值附加到不同的数组没有问题。
let subArrays: [[Int]] = [[], [], [], []]
for age in ages {
switch age {
case 0...25:
subArrays[0].append(age)
case 26...50:
subArrays[1].append(age)
case 51...75:
subArrays[2].append(age)
default:
subArrays[3].append(age)
}
}
我的问题是:
是否有更简洁的方法可以使用map
,split
或任何其他功能执行此操作。
由于
答案 0 :(得分:3)
这不会使用map
或任何花哨的东西,但您可以轻松消除switch
:
var subArrays: [[Int]] = [[], [], [], []]
for age in ages {
subArrays[min((age - 1) / 25, 3)].append(age)
}
使用min
可确保所有76及更高的值都进入最后一个广告位。
要测试所有边界情况,请尝试:
let ages = [ 50, 67, 75, 76, 25, 12, 26, 51, 99, 45, 0, 120, 16 ]
然后:
print(subArrays)
给出:
[[25,12,0,16],[50,26,45],[67,75,51],[76,99,120]]
答案 1 :(得分:2)
更通用的版本,不依赖于您的范围的任何数学属性:
# Get data for 2014
sym <- "AAPL"
md <- new.env()
getSymbols(Symbols = sym, from = "2014-01-01", to = "2014-12-31", env = md)
last_date <- end(get(sym, md))
new <- getSymbols(Symbols = sym, from = last_date + 1, to = Sys.Date(), auto.assign= FALSE)
assign(x = sym, value = rbind(get(sym, md), new), envir = md)
head(md$AAPL, 3)
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
# 2014-01-02 555.68 557.03 552.02 553.13 58671200 74.11592
# 2014-01-03 552.86 553.70 540.43 540.98 98116900 72.48790
# 2014-01-06 537.45 546.80 533.60 543.93 103152700 72.88317
tail(md$AAPL, 3)
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
# 2017-02-22 136.43 137.12 136.11 137.11 20745300 137.11
# 2017-02-23 137.38 137.48 136.30 136.53 20704100 136.53
# 2017-02-24 135.91 136.66 135.28 136.66 21690900 136.66
请注意,它不会检查重叠范围。
答案 2 :(得分:0)
基于rmaddy的答案(几乎相同)但在一行内:
let subs = (0...3).map { sub in ages.filter { sub == min(($0 - 1) / 25, 3) } }