gpt4 book ai didi

matrix - Swift:如何在 Swift 中声明二维数组(网格或矩阵)以允许随机插入

转载 作者:搜寻专家 更新时间:2023-10-30 22:14:26 26 4
gpt4 key购买 nike

我需要能够在二维矩阵或网格中存储有关单元格的信息。数据不连续,因此当较低的行和列没有数据时,我可能需要将数据存储在 5,5。

我的第一个想法是动态调整大小的数组。但是 Swift 数组的边界不会自动增长。如果我尝试在索引 5 处放置超出其当前大小的内容,它将失败并出现越界异常。

Swift 或 Cocoa 中是否有支持随机访问网格的集合类。 NSArray 也不支持它。

另一个想法是将元素存储在字典中,并使用行、列的元组作为键。但是,元组不可哈希,不能用作字典的键。

我目前的方法是用一个用空值填充的设定大小预初始化数组。有没有更好的办法?

最佳答案

这是一个非常基本的实现,使用 Dictionary 作为后端存储:

struct Matrix2D<KeyElem:Hashable, Value> {

var _storage:[KeyElem:[KeyElem:Value]] = [:]

subscript(x:KeyElem, y:KeyElem) -> Value? {
get {
return _storage[x]?[y]
}
set(val) {
if _storage[x] == nil {
_storage[x] = [:]
}
_storage[x]![y] = val
}
}
}

var matrix = Matrix2D<Int, String>()

matrix[1,2] = "foo"

作为DictionaryLiteralConvertible:

extension Matrix2D:DictionaryLiteralConvertible {

typealias Key = (x:KeyElem, y:KeyElem)

init(dictionaryLiteral elements: (Key, Value)...) {
for (key, val) in elements {
self[key.x, key.y] = val
}
}
}

var matrix:Matrix2D = [(1,2):"foo", (2,3):"bar"]

数组后端版本

struct Matrix2D<T> {

var _storage:[[T?]] = []

subscript(x:Int, y:Int) -> T? {
get {
if _storage.count <= x {
return nil
}
if _storage[x].count <= y {
return nil
}
return _storage[x][y]
}
set(val) {
if _storage.count <= x {
let cols = [[T?]](count: x - _storage.count + 1, repeatedValue: [])
_storage.extend(cols)
}
if _storage[x].count <= y {
let rows = [T?](count: y - _storage[x].count + 1, repeatedValue: nil)
_storage[x].extend(rows)
}
_storage[x][y] = val
}
}
}

关于matrix - Swift:如何在 Swift 中声明二维数组(网格或矩阵)以允许随机插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26563821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com