【问题标题】:Swift - Smart way to cycle through an Array of Array [[Int]]Swift - 循环遍历数组 [[Int]] 的智能方法
【发布时间】:2019-04-07 18:25:55
【问题描述】:

我使用 Array of Array [[Int]] 在地图中存储坐标。 例如,我想用“1”替换所有“2”。 为此,我创建了 2 个用于定义数组空间并检查内容的 for 循环。 这不是很灵活,只适用于定义大小的数组。

private func remove2fromArray(currentArray: [[Int]]) -> [[Int]] {

    var newArray : [[Int]] = currentArray

    for section in 0...14 {
        for row in 0...19 {
            if newArray[section][row] == 2
            { newArray[section][row] = 1 }
        }
    }
    return newArray
}

有没有办法只扫描数组的内容来替换数字?

例如 currentArray.findAndReplace(find:2, replace: 1) 或类似的,适用于 [[Int]]?

【问题讨论】:

  • 至少删除那些硬编码的范围。循环基于数组的实际大小。
  • 为什么要使用二维数组来存储坐标?这里的模型是什么?拥有一个 Coordinate 结构并存储它们的平面数组不是更好吗?
  • 一个数组是“一个有序的、随机访问的集合”。对我来说,这听起来不像是坐标。你最好创建一个更适合坐标的数据类型。
  • 它工作得非常好,因为我可以访问数组 [section] [row],在我看来它定义了一个二维空间 - 坐标。你的意思是这样的: struct {x:Int;y:Int;value:Int} 吗? - 这将更难满足我的意见。
  • 如果您能解释如何替换卡编码范围,这将有所帮助,因为我无法对数组中的数组使用计数。但我也许可以使用下面的地图功能来做到这一点。

标签: arrays swift loops


【解决方案1】:

你可以这样做:

let result = array.map { subarray in
    subarray.map { integer -> Int in
        if integer == 2 {
            return 1
        } else {
            return integer
        }
    }
}

更短:

let result = array.map {
    $0.map { integer in
        return integer == 2 ? 1 : integer
    }
}

还有一个单行:

let result = array.map { $0.map { $0 == 2 ? 1 : $0 } }

我将尝试用简单的话来解释这里发生的事情:map 的作用是它一个一个地遍历数组元素并在元素上应用一个函数。

在我们的示例中,第一个映射遍历外部数组元素,因此这里的 $0 指的是内部数组(一个接一个)。

第二个映射遍历内部数组的元素。所以内部映射中的$0 指的是内部数组元素的每个元素。

【讨论】:

  • 就像一个魅力。我想我必须通读手册,.map 实际上做了什么,或者你能解释一下各个参数吗? map 返回一个数组,其中单独的内容由 $0 表示并由后面的函数修改。我在哪里可以了解带有“?”的短函数和 ”:”?这看起来很精简。
  • 我更新了答案以解释发生了什么。如果您需要更多解释,请告诉我。
  • 完美。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 2014-06-04
  • 1970-01-01
  • 2010-11-03
  • 2019-07-10
相关资源
最近更新 更多