Scala:初始化图的顶点

时间:2015-05-22 13:31:44

标签: list scala graph

我有这样的事情:

def vertices: List[Vertex] = List()
def edges: List[Edge] = List()
def adjMatrix: Array[Array[Int]] = Array.ofDim[Int](vertices.size, vertices.size)
def addVertex(lbl: Char) = {
    val vertex = new Vertex(lbl)
     vertex :: vertices
     vertex
}
class Vertex(label: Char) {
  val visited: Boolean = false
  def echo() = print(label)
}

当我想创建这样的节点时:

def main(args: Array[String]) {
    val node1 = g.addVertex('A')
    val node2 = g.addVertex('B')
    val node3 = g.addVertex('C')

    println(g.vertices.size) // the result is 0 ???!!!
}

我不知道为什么列表vertices没有填写?

1 个答案:

答案 0 :(得分:1)

这是因为在方法中:

def addVertex(lbl: Char) = {
    val vertex = new Vertex(lbl)
    vertex :: vertices // This does nothing
    vertex
}

您不更改列表顶点。您只需生成一个新列表vertex :: vertices,但请立即将其丢弃。

请尝试将方法更改为以下内容:

def addVertex(lbl: Char) = {
    val vertex = new Vertex(lbl)
    vertices = vertex :: vertices // This also changes the var vertices
    vertex
}

此外,成员vertices应该是var而不是def,总是返回一个空列表。

var vertices: List[Vertex] = List()

这是一个不可变图的变体:

case class Vortex(lbl: String)

case class Graph(vertices:Set[Vortex], edges:Set[(Vortex,Vortex)]) {
  def addVortex(vortex:Vortex) : Graph =
    Graph(vertices + vortex, edges)
  def addEdge(edge: (Vortex, Vortex)) : Graph =
    Graph(vertices + edge._1 + edge._2, edges + edge)
}