通过变量值

时间:2017-02-27 00:40:05

标签: arrays swift

我有一系列年龄。

我想通过年龄值将数组拆分为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)
                }
            }

我的问题是: 是否有更简洁的方法可以使用mapsplit或任何其他功能执行此操作。

由于

3 个答案:

答案 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) } }