如何引用作为JavaScript键传递到映射中的类实例
我正在使用贴图作为邻接列表来实现一个graph类,并使用一个简单的类Vertex来表示图形中的每个节点:如何引用作为JavaScript键传递到映射中的类实例,javascript,class,graph,vertex,Javascript,Class,Graph,Vertex,我正在使用贴图作为邻接列表来实现一个graph类,并使用一个简单的类Vertex来表示图形中的每个节点: export class Vertex { constructor(value) { if (value) this.value = value; else throw new Error("Value must be specified"); } getValue() { return this.value;
export class Vertex {
constructor(value) {
if (value) this.value = value;
else throw new Error("Value must be specified");
}
getValue() {
return this.value;
}
setValue(value) {
if (value) this.value = value;
else throw new Error("Value must be specified");
}
}
然后在我的graph类中,我实现了一个构造函数和两个用于添加顶点和边的方法:
export class UndirectedGraph {
constructor() {
this.adjacencyList = new Map();
}
addVertex(value) {
if (value) {
const vertex = new Vertex(value);
this.adjacencyList.set(vertex, []);
}
}
addEdge(to, from) {
if (
!to ||
!from ||
!(to.constructor === Vertex && from.constructor === Vertex)
) {
throw new Error("Arguments must be of type Vertex");
}
if (
!this.adjacencyList.get(to) ||
!this.adjacencyList.get(from)
) {
throw new Error(
"Both arguments must already be nodes in this undirected graph"
);
}
this.adjacencyList.get(to).push(from);
this.adjacencyList.get(from).push(to);
}
getAdjacencyList() {
return this.adjacencyList;
}
}
然后我想调用addEdge函数在Vertex类型的两个实例之间创建一条边:
const graph = new UndirectedGraph();
graph.addVertex("A");
graph.addVertex("B");
graph.addVertex("B");
graph.addEdge(..., ...);
要在A和B的特定实例之间创建边,我需要传递什么到addEdge函数?我没有可以引用的顶点实例的变量
我希望图形能够存储重复的值,例如名称,因此使用类实例似乎是一个明显的选择,但现在我被困在如何访问它们包含的值上,因为我不确定如何在映射中搜索类实例,即graph.getAdjacencyList.get。。。。所有帮助如果addVertex方法创建顶点实例,并且addEdge方法希望将该实例作为参数,则需要将其返回给这些方法的调用方:
然后你可以像这样使用它
const graph = new UndirectedGraph();
const vertex1 = graph.addVertex("A");
const vertex2 = graph.addVertex("B");
const vertex3 = graph.addVertex("B");
graph.addEdge(vertex1, vertex2);
graph.addEdge(vertex1, vertex3);
graph.addEdge(vertex2, vertex3);
你能澄清一下你的意思吗?我希望这个图能够存储重复的值,比如名称,所以使用类实例似乎是一个明显的选择。我的思路是,如果我只添加字符串或数字或其他什么,那么任何重复项都会变得混乱。我怎样才能分辨出一根约翰·史密斯弦和另一根约翰·史密斯弦?类实例是唯一的,因此我应该能够区分我指的是哪个John Smith如果您希望能够存储具有相同字符串值的多个顶点,但仍然可以轻松区分它们,则需要在它们上存储另一段数据,就像ID一样。仅将字符串用于人类可读的显示,但是要用ID进行实际工作。不确定类实例如何让您区分顶点。这取决于用户存储返回值,是否有方法确保它们这样做而不仅仅是调用graph。addVertexYes当然会这样做,否则,它们无法在它们之间添加边…唯一的替代方法是为它们提供唯一的ID,而不是值,或者除了值之外
const graph = new UndirectedGraph();
const vertex1 = graph.addVertex("A");
const vertex2 = graph.addVertex("B");
const vertex3 = graph.addVertex("B");
graph.addEdge(vertex1, vertex2);
graph.addEdge(vertex1, vertex3);
graph.addEdge(vertex2, vertex3);