使用不同的数据类型快速创建多维数组

Posted

技术标签:

【中文标题】使用不同的数据类型快速创建多维数组【英文标题】:Create multidimentional array in swift with different datatypes 【发布时间】:2016-11-12 18:41:25 【问题描述】:

这是我在这里的第一个问题,如果不是很清楚,请原谅我。

我正在尝试快速创建一个数组,该数组将存储数组数组或整数。 数组应该是我将使用的数据的简单表示,它基本上是一种树状的数据结构,就像这样......

数组 = [ [[ [2, 3] ], [ 1, 4 ], [ 2 ]], [ 2 ], [[2, 5], [6, 1] ], 3 ]

总的来说,数组是分支,整数是叶子

我尝试过像这样将它们声明为可选项

var test2 = [[[Int]?]?]()

或者使用 typedef,但我仍然无法让它工作。

此外,应该可以向任何数组添加新叶子

【问题讨论】:

你为什么不定义一棵树?这会容易得多。 var test2 = [Any]() @shallowThought 我想过类似的事情,但我使用的是 AnyObject 而不是 Any。这似乎适用于分配部分,但就像我想念自动完成部分一样,这是我想要的。 查看 Swift 的枚举。考虑两种选择,一种用于具有关联整数的叶子,另一种用于具有关联数组的分支。采用这种方法,您应该能够准确了解可以进入树的内容,而使用 AnyObject 您可以将错误类型的值放入树中。 如果你想要一棵树,就创建一棵树。使用subtreevalue 属性创建Node 结构或类。 var value: Int?var subtree: [Node]? 【参考方案1】:

这里是基于enum的解决方案,先声明enum

enum Node

    case leaf(Int)
    case branch([Node])

您现在可以编写如下内容:

let x = Node.leaf(42)
let y = Node.branch([Node.leaf(42), Node.leaf(24)])

但是,这很快就会变得很费力。幸运的是 Swift 允许从字面量转换,所以我们添加:

extension Node : ExpressibleByIntegerLiteral

    init(integerLiteral value: Int)
    
        self = .leaf(value)
    


extension Node : ExpressibleByArrayLiteral

    init(arrayLiteral elements: Node...)
    
        self = .branch(elements)
    

加上这些,我们现在可以将上面的两个let 语句写成:

let x : Node = 42
let y : Node = [42, 24]

哪个更好。但是,如果我们 print(y) 我们得到:

branch([Node.leaf(42), Node.leaf(24)])

如果你想漂亮地打印,你可以添加:

extension Node : CustomStringConvertible

    var description : String
    
        switch self
        
            case .leaf(let value):
                    return value.description
            case .branch(let branches):
                    return branches.description
        
    

现在print(y) 给你:

[42, 24]

最后是你的例子:

let w : Node = [[[[2, 3]], [1, 4], [2]], [2], [[2, 5], [6, 1]], 3]

打印为:

[[[[2, 3]], [1, 4], [2]], [2], [[2, 5], [6, 1]], 3]

您将希望使用诸如isLeaf 等谓词来完成enum 类型,但这是基本思想。

HTH

【讨论】:

以上是关于使用不同的数据类型快速创建多维数组的主要内容,如果未能解决你的问题,请参考以下文章

Java数组:数组与多维数组

多维数组

Java--数组概述 & 数组创建和声明 & 数组使用 & 多维数组

Java数组声明创建和使用以及多维数组Arrays类稀疏数组

java一维数组和多维数组的使用

C# 中的多维关联数组