Я всегда получаю исключение нулевого указателя. в строке 25 с "adjVertices.get (v1) .add (v2) ... что мне не хватает?
Если adjVertices.get(v1)
вернет null
, выражение adjVertices.get(v1).add(v2)
сгенерирует NullPointerException
потому что .add(v2)
будет вызываться по ссылке null
. Сделайте это следующим образом:
void addEdge(String label1, String label2) {
Vertex v1 = new Vertex(label1);
Vertex v2 = new Vertex(label2);
if (adjVertices.get(v1) != null) {
adjVertices.get(v1).add(v2);
}
if (adjVertices.get(v2) != null) {
adjVertices.get(v2).add(v1);
}
}
Другая проблема в вашем коде состоит в том, что вы не реализовали hashCode
и equals
в Vertex
. Обязательно реализуйте hashCode
и equals
в классе всякий раз, когда вы собираетесь добавить экземпляры этого класса в HashMap
. Ниже приведен полный код:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
class Vertex {
String label;
Vertex(String label) {
this.label = label;
}
@Override
public int hashCode() {
return Objects.hashCode(label);
}
@Override
public boolean equals(Object obj) {
return label.equals(((Vertex) obj).label);
}
}
class Graph {
public Map<Vertex, List<Vertex>> adjVertices;
Graph() {
this.adjVertices = new HashMap<Vertex, List<Vertex>>();
}
void addVertex(String label) {
adjVertices.putIfAbsent(new Vertex(label), new ArrayList<>());
}
void addEdge(String label1, String label2) {
Vertex v1 = new Vertex(label1);
Vertex v2 = new Vertex(label2);
if (adjVertices.get(v1) != null) {
adjVertices.get(v1).add(v2);
}
if (adjVertices.get(v2) != null) {
adjVertices.get(v2).add(v1);
}
}
}
public class Main {
public static void main(String args[]) {
// Create a graph given in the above diagram
Graph g = new Graph();
g.addVertex("CS2010");
g.addVertex("CS2370");
g.addVertex("CS2381");
g.addVertex("CS3221");
g.addVertex("CS3600");
g.addEdge("CS2010", "CS2370");
g.addEdge("CS2370", "CS2381");
g.addEdge("CS2370", "CS3600");
g.addEdge("CS2381", "CS3221");
System.out.println(g.adjVertices);
}
}
Выход:
{Vertex@76fdc54d=[Vertex@76fdd14a], Vertex@76fe414e=[Vertex@76fdd16a], Vertex@76fdd14a=[Vertex@76fdc54d, Vertex@76fdd16a, Vertex@76fe5013], Vertex@76fdd16a=[Vertex@76fdd14a, Vertex@76fe414e], Vertex@76fe5013=[Vertex@76fdd14a]}