arrays - 查找数组元素索引的更好方法?

标签 arrays swift indexing architecture grid

我对 Swift 和一般编程还比较陌生。

我正在开展一个项目,该项目使用二维数组来表示我存储自定义对象的网格:

class Grid {
    var element: [[GridElement]]
}

我经常需要通过坐标访问元素。例如:

let gridElement = grid.element[coord.x][coord.y]

但是 我还需要经常从给定的 gridElement(它在 2d 数组中的索引)中获取坐标。这导致嵌套循环似乎不是最快或最优雅的解决方案:

func getCoord(_ gridElement: GridElement) -> Coord {
    for x in 0..<xSize {
        for y in 0..<ySize {
            if element[x][y] == gridElement { return Coord(x: x, y: y) }
        }
    }
    return Coord(x: -1, y: -1)
}

因为我希望它能顺利处理大型网格,所以这看起来不像是解决方案。我错过了一些简单的东西吗?

我正在考虑将坐标存储在 GridElement 对象本身中,但这也感觉像是糟糕的设计,因为当 GridElement 改变位置时我需要不断更新它。

这更像是一个设计/架构问题,而不是寻找一个神奇的功能来解决我的问题。感觉应该建立双向引用的设计模式,但我还没有找到答案。有什么建议吗?

最佳答案

我认为您的 getCoord 函数应该是这样的:

func getCoord(_ gridElement: GridElement) -> Coord {
    for (i, row) in element.enumerated() {
        if let index = row.firstIndex(of: gridElement) {
            return Coord(x: i, y: index)
        }
    }
    return Coord(x: -1, y: -1)
}

关于arrays - 查找数组元素索引的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55177047/

相关文章:

Postgresql 部分索引超出最大索引行大小

c++ - 创建给定变量集的所有可能排列

c++ - 在 C++ 中打印 vector 数组

ios - 如何使用 UIImagePicker/Swift 调整照片大小

MySQL - 索引在登台服务器上工作,但在生产服务器上不起作用

Excel 匹配 - 最大、第二大、第三大和最低、第二低等,没有重复,包括空格和相同的分数

javascript 将循环数组的函数传递给使用 switch 语句日期方法的函数

arrays - 一维生命游戏的非迭代算法

ios - 如何防止 UIPageViewController 的 setViewControllers 方法崩溃?

ios - 将 Firebase 文档计数返回为表格行计数