addEdge for Graph - это возврат нулевого указателя? - PullRequest
0 голосов
/ 19 апреля 2020

Поэтому я пытаюсь понять хеш-карты и графики, когда я запускаю свой код, я всегда получаю исключение нулевого указателя. в строке 25 с «adjVertices.get (v1) .add (v2);» и я уверен, что следующая строка тоже его выбросит, если доберется до нее. что мне не хватает? Заранее спасибо.

import java.util.*;

public class Graph {

    private Map<Vertex, List<Vertex>> adjVertices;

    Graph() {
        this.adjVertices = new HashMap<Vertex, List<Vertex>>();
    }

    class Vertex {
        String label;
        Vertex(String label) {
            this.label = label;
        }
    }

    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);
        adjVertices.get(v1).add(v2);
        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");

    }
}

1 Ответ

0 голосов
/ 19 апреля 2020

Я всегда получаю исключение нулевого указателя. в строке 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]}
...