【问题标题】:Swift - array of strings to multiple subarrays with constant number of stringsSwift - 字符串数组到具有恒定字符串数的多个子数组
【发布时间】:2015-05-14 01:39:44
【问题描述】:

假设我有这个字符串数组:

let Vehicles = ["Aeroplane", "Bicycle", "CarVehicle", "Lorry", "Motorbike", "Scooter", "Ship", "Train"]

我想要的是这样的结果:

let resultArray = [["Aeroplane", "Bicycle", "CarVehicle", "Lorry"], ["Motorbike", "Scooter", "Ship", "Train"]]

我知道我可以通过 for 做到这一点,但我想在 Swift 中使用高阶函数。我的意思是像 map、reduce、filter 这样的函数。我认为这样做是可能的,而且可能会更好。谁能帮我这个?谢谢

【问题讨论】:

  • 参见my answer 一个非常相似的问题,该问题提供多达 5 种不同的方法来解决您的问题。

标签: arrays swift


【解决方案1】:

map()stride() 的可能解决方案:

let vehicles = ["Aeroplane", "Bicycle", "CarVehicle", "Lorry", "Motorbike", "Scooter", "Ship", "Train"]
let each = 4

let resultArray = map(stride(from: 0, to: vehicles.count, by: each)) {
    vehicles[$0 ..< advance($0, each, vehicles.count)]
}

println(resultArray)
// [[Aeroplane, Bicycle, CarVehicle, Lorry], [Motorbike, Scooter, Ship, Train]]

闭包中advance()的使用保证了代码 即使数组元素的数量不是 4 的倍数也有效 (结果中的最后一个子数组会更短。)

你可以把它简化成

let resultArray = map(stride(from: 0, to: vehicles.count, by: each)) {
    vehicles[$0 ..< $0 + each]
}

如果你知道数组元素的数量是4的倍数。

严格来说resultArray的元素不是数组 但是数组切片。在许多情况下,这并不重要,否则你 可以替换为

let resultArray = map(stride(from: 0, to: vehicles.count, by: each)) {
    Array(vehicles[$0 ..< advance($0, each, vehicles.count)])
}

【讨论】:

  • 看起来像我要找的东西。我忘了提到元素的数量不需要是 4 的倍数,所以感谢第一个解决方案。还有一件事。我的问题是我的结果是ArraySlice&lt;String&gt; 而不是[String]。我该如何解决?
  • @MartinR 也可以同时使用reducemap 吗?
  • @JacobsonTalom:reduce() 是可能的,但是在每次调用 reduce 闭包时都会创建一个“嵌套数组”,所以这可能不太有效。当然,可能还有其他我没有想到的解决方案。
猜你喜欢
  • 2015-09-11
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 2017-01-08
相关资源
最近更新 更多