数据结构:Array2D

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看270 回复回复6 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 270|回复: 6
收起左侧

数据结构:Array2D

[复制链接]
Ding 发表于 2016-11-3 10:10:48 | 显示全部楼层 |阅读模式
快来登录
获取优质的苹果资讯内容
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
订阅梳理好了的知识点专辑



序言

发现了一个美好的地方:swift-algorithm-club,有一群猿媛基于Swift的基本数据结构Array、Dictionary、Set等扩展出了程序世界其他数据结构,另外用Swift讨论实现了些常用算法。

看了几篇说明文档及源码,或翔实或简洁,深受启发。打算记录下来,意译文档,或抒发个人感悟,另将没有适配到Swift3.0的代码做好适配。这一系列是数据结构,之后可就算法再来一系列。

数据结构:Array2D

数据结构:Array2D - 敏捷大拇指 - 数据结构:Array2D





Array2D 二维数组

在C或Objective-C里,我们可以这样:

[C] 纯文本查看 复制代码
int cookies[9][7];


定义一个 9x7 cookies 格子。这将创建一个包含63个int的二维数组. 要取出第3行第6列的元素,这样就行:

[C] 纯文本查看 复制代码
myCookie = cookies[3][6];


不爽的是,在Swift里不能那样写。在Swift的世界创建一个多维数组要类似这样做:

[Swift] 纯文本查看 复制代码
var cookies = [[Int]]()
for _ in 1...9 {
    var row = [Int]()
    for _ in 1...7 {
        row.append(0)
    }
    cookies.append(row)
}


取元素倒也简单:

[Swift] 纯文本查看 复制代码
let myCookie = cookies[3][6]


上面的创建代码也可以缩为一行:

[Swift] 纯文本查看 复制代码
var cookies = [[Int]](repeating: [Int](repeating: 0, count: 7), count: 9)


老实说,太丑了。可以来个工具函数美化美化:

[Swift] 纯文本查看 复制代码
func dim<T>(_ count: Int, _ value: T) -> [T] {
    return [T](repeating: value, count: count)
}


现在可以这样创建我们的二维数组了:

[Swift] 纯文本查看 复制代码
var cookies = dim(9, dim(7, 0))


Swift 能推断出数组的元素是 Int 类型,因为我们是以0这个数字初始化数组的。如果元素是String呢:

[Swift] 纯文本查看 复制代码
var cookies = dim(9, dim(7, "yum"))


再用 dim() 定义多维数组试试:

[Swift] 纯文本查看 复制代码
var threeDimensions = dim(2, dim(3, dim(4, 0)))


这种形式的多维数组(即嵌套的一维数组),缺陷是什么? 就是看起来不明朗,定位元素费事。

所以,我们还是来定义自己的二维数组。看看,简洁又性感:

[Swift] 纯文本查看 复制代码
public struct Array2D<T> {
    public let columns: Int
    public let rows: Int
    private var array: [T]
    public init(columns: Int, rows: Int, initialValue: T) {
        self.columns = columns
        self.rows = rows
        array = Array(repeating: initialValue, count: rows*columns)
    }
    public subscript(column: Int, row: Int) -> T {
        get {
            return array[row*columns + column]
        }
        set {
            array[row*columns + column] = newValue
        }
    }
}


Array2D 支持泛型,可以放任意类型的元素,不只是数字。

现在创建我们的cookies数组:

[Swift] 纯文本查看 复制代码
var cookies = Array2D(columns: 9, rows: 7, initialValue: 0)


因为写了 subscript 函数,取元素也方便:

[Swift] 纯文本查看 复制代码
let myCookie = cookies[column, row]


改变某个元素:

[Swift] 纯文本查看 复制代码
cookies[column, row] = newCookie


Array2D 内部用了一个一维的数组来存储数据,实际元素的索引是 row x columns + column。 但作为 Array2D 的使用者,不用担心这些,你只需要以为确实是个rows x columns的二维数组, 放心用就好。 这就是对原始类型包装的好处。




原作者: Matthijs Hollemans

都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

评分

参与人数 1金钱 +10 贡献 +10 专家分 +10 收起 理由
Anewczs + 10 + 10 + 10 32个赞!专家给力!

查看全部评分

本帖被以下淘专辑推荐:

转行的 发表于 2016-11-3 11:15:50 | 显示全部楼层
是很丑。希望官方支持。
我是90后 发表于 2016-11-3 11:19:09 | 显示全部楼层
转行的 发表于 2016-11-3 11:15
是很丑。希望官方支持。

现在的语法还得留着,操作复杂的数组时需要。
 楼主| Ding 发表于 2016-11-3 11:20:50 | 显示全部楼层
本帖最后由 Ding 于 2016-11-3 11:31 编辑
转行的 发表于 2016-11-3 11:15
是很丑。希望官方支持。

就初始化而言,
官方这样:
var cookies = [[Int]](repeating: [Int](repeating: 0, count: 7), count: 9)
Array2D这样:
var cookies = Array2D(columns: 9, rows: 7, initialValue: 0)
索引操作等没什么两样

所以,其实,官方的勉强可以接受。
另外,如果官方支持了Array2D这样的类型,是不是考虑Array3D、Array4D...
那就郁闷了.个人看法:作为具体使用者可以自己扩展,官方支持不是很好。


 楼主| Ding 发表于 2016-11-3 11:23:53 | 显示全部楼层
我是90后 发表于 2016-11-3 11:19
现在的语法还得留着,操作复杂的数组时需要。

是。
另外,这个帖子里提到的dim函数,官方倒是可以考虑支持。
 楼主| Ding 发表于 2016-11-7 17:51:03 | 显示全部楼层
Array2D作者原文及代码还未支持到Swift3,帖子做了更新。
瑶池 发表于 3 天前 | 显示全部楼层
Ding 发表于 2016-11-3 11:20
就初始化而言,
官方这样:
var cookies = [](repeating: (repeating: 0, count: 7), count: 9)

赞!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表