我有这样的事情:
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
没有填写?
答案 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)
}