【问题标题】:is there a better way then nested loops?有没有比嵌套循环更好的方法?
【发布时间】:2018-08-05 21:47:27
【问题描述】:

我有以下代码:

(0...engine.rows-1).forEach {row in
        (0...engine.cols-1).forEach {col in
            //print("(\(row),\(col)) state = \(engine.grid[(row,col)])")
            switch engine.grid[(row,col)] {
            case CellState.empty: emptyCount = emptyCount + 1
            case CellState.alive: aliveCount = aliveCount + 1
            case CellState.died: diedCount = diedCount + 1
            case CellState.born: bornCount = bornCount + 1
            }
        }
    }

看起来过滤器可以更有效地执行此操作,但我不了解复杂对象的语法。如果没有过滤器,有没有更好的方法在 swift 中执行嵌套循环?

谢谢

【问题讨论】:

  • 你想做什么?
  • (0...engine.rows-1) 最好写成(0..<engine.rows)
  • 什么是engine?它显然不是标准的 Swift 结构。引擎是否提供了一种获取所有单元格或单元格枚举器的方法?嵌套循环有什么问题?它们是一种经过时间验证的二维结构行走方式。
  • 我认为可能有一种方法可以使用过滤器,但听起来好像没有。
  • 很抱歉没有回答前两个问题。我正在尝试计算网格中每个单元格状态的计数,这实际上是具有某些属性的数组。我知道过滤器可以生成一个符合特定条件的数组。我想我可以做到这一点并使用结果过滤器的计数。感谢您指出表示范围的更好方法。

标签: swift swift3


【解决方案1】:

这看起来像Conway's Game of Life

您正在循环计算各种细胞状态的网格。嵌套循环是执行此操作的自然方式。我建议使用for in 而不是forEach。另外,我建议创建一个字典来保存计数:

// Create dictionary to hold counts
var counts: [CellState : Int] = [.alive: 0, .died: 0, .born: 0, .empty: 0]

for row in 0 ..< engine.rows {
    for col in 0 ..< engine.cols {
        //print("(\(row),\(col)) state = \(engine.grid[(row,col)])")
        counts[engine.grid[(row, col)]] += 1
    }
}

另一种方式:

您没有向我们提供有关您的 Engine classstruct 的任何信息。根据grid 的实现,可能有一种方法可以获取所有单元格的数组。

例如,如果您使用N-Dimensional Array 创建grid,那么您可以使用grid.data 将所有单元格作为数组获取。

struct Engine {
    let rows: Int
    let cols: Int
    var grid: NDimArray<CellState>

    init(rows: Int, cols: Int) {
        self.rows = rows
        self.cols = cols
        self.grid = NDimArray<CellState>(dimensions: rows, cols, initial: CellState.empty)
    } 
}

设置单元状态如下所示:

var engine = Engine(rows: 20, cols: 20)
engine.grid[0, 0] = .alive
engine.grid[0, 1] = .alive

那么计算单元格类型的代码就变成了:

var counts: [CellState : Int] = [.alive: 0, .died: 0, .born: 0, .empty: 0]
engine.grid.data.forEach { cell in counts[cell] += 1 }

【讨论】:

  • 这是人生游戏。我有一堂关于 Swift 的课程,并且一直在努力解决闭包等问题。我担心我会默认回到非 Swift 编程方式。
  • 看看我更新的答案(就在一分钟前)。
  • 更好的解决方案。谢谢!
猜你喜欢
  • 2013-08-04
  • 2015-04-24
  • 1970-01-01
  • 2022-01-10
  • 2019-11-06
  • 1970-01-01
  • 2014-02-22
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多