Swift中的可变数组数组

3

我正在尝试在Swift中实现邻接列表,基本上是一组列表,或者我猜是一组可变的数组。我已经在Java中编写了深度优先搜索算法的实现,并希望用Swift编写相同的代码。下面是代表图形的Java代码。有什么想法吗?如果有帮助的话,以下是Java代码:

public class Graph
{

    private List<Integer>[] adj;

    public Graph(int numberOfVertices)
    {
         adj = (List<Integer>[]) new List[numberOfVertices];
         ...
         for(int i = 0; i < numberOfVertices; i++)
               adj[i] = new ArrayList<Integer>(); 

    }

即使知道如何声明包含可变数组的数组变量也很好。我在苹果发布的书籍或网络上没有找到如何做到这一点的信息。


一个解决方法是使用AnyObject[]作为根数组,然后您可以将新的数组添加到该数组中。 - LongNV
@LongNV 没有理由使用如此通用的类型 AnyObject。您可以指定数组中的数组的确切类型。 - drewag
2个回答

6

您可以通过以下方式简单地声明一个数组的数组:

var nestedArrays : [[Int]] = []
nestedArrays.append([1, 2])
nestedArrays[0].append(3)
nestedArrays // [[1, 2, 3]]

如果您希望它以一些空数组开头,您可以执行以下操作:
var nestedArrays = [[Int]](count: 10, repeatedValue: [])

那么它将以10个空数组开始。

你的类可以长这样:

class Graph {
    var adj : [[Int]]

    init(numberOfVertices: Int) {
        adj = [[Int]](count: numberOfVertices, repeatedValue: [])
    }
}

或者,如果您想创建一个可以拥有任何类型对象图的类,您可以使用泛型:

class Graph<T> {
    var adj : [[T]]

    init(numberOfVertices: Int) {
        adj = [[T]](count: numberOfVertices, repeatedValue: [])
    }
}

2
这是你代码的Swift版本:
class Graph {
    var adj : Array<Array<Int>>

    init (_ numberOfVertices: Int) {
        adj = Array<Array<Int>> (count: numberOfVertices, repeatedValue: [])
        for i in 1..numberOfVertices {
            adj[i] = Array<Int> ()
        }
    }
}

以及一些“测试”:

 11> var gr = Graph(5)
gr: Graph = {
  adj = size=5 {
    [0] = size=0
    [1] = size=0
    [2] = size=0
    [3] = size=0
    [4] = size=0
  }
}
 12> gr.adj[1].append (2)
 13> gr.adj[1].append (10)
 ...
 15> gr.adj[4].append (7)
 16> gr.adj
$R5: Int[][] = size=5 {
  [0] = size=0
  [1] = size=2 {
    [0] = 2
    [1] = 10
  }
  [2] = size=0
  [3] = size=0
  [4] = size=1 {
    [0] = 7
  }
}
 17> gr.adj[4][0]
$R7: Int = 7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接