Как распечатать результаты трансверсалии в ширину с учетом этого кода (Java) - PullRequest
1 голос
/ 10 июля 2020

Как распечатать результаты обхода в ширину, используя пример кода из GitHub? где я должен поместить метод Main? Спасибо, вот ссылка на код для первого класса: https://github.com/eugenp/tutorials/blob/master/data-structures/src/main/java/com/baeldung/graph/Graph.java и вот код:

    package com.baeldung.graph;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    public class Graph {
        private 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 removeVertex(String label) {
        Vertex v = new Vertex(label);
        adjVertices.values().stream().forEach(e -> e.remove(v));
        adjVertices.remove(new Vertex(label));
    }

    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);
    }

    void removeEdge(String label1, String label2) {
        Vertex v1 = new Vertex(label1);
        Vertex v2 = new Vertex(label2);
        List<Vertex> eV1 = adjVertices.get(v1);
        List<Vertex> eV2 = adjVertices.get(v2);
        if (eV1 != null)
            eV1.remove(v2);
        if (eV2 != null)
            eV2.remove(v1);
    }

    List<Vertex> getAdjVertices(String label) {
        return adjVertices.get(new Vertex(label));
    }
    
    String printGraph() {
        StringBuffer sb = new StringBuffer();
        for(Vertex v : adjVertices.keySet()) {
            sb.append(v);
            sb.append(adjVertices.get(v));
        }
        return sb.toString();
    }

    class Vertex {
        String label;
        Vertex(String label) {
            this.label = label;
        }
        
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + getOuterType().hashCode();
            result = prime * result + ((label == null) ? 0 : label.hashCode());
            return result;
        }
        
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Vertex other = (Vertex) obj;
            if (!getOuterType().equals(other.getOuterType()))
                return false;
            if (label == null) {
                if (other.label != null)
                    return false;
            } else if (!label.equals(other.label))
                return false;
            return true;
        }

        @Override
        public String toString() {
            return label;
        }


        private Graph getOuterType() {
            return Graph.this;
        }
    }
}

Вот ссылка для второго класса: https://github.com/eugenp/tutorials/blob/master/data-structures/src/main/java/com/baeldung/graph/GraphTraversal.java а вот код:

    package com.baeldung.graph;
    
    import java.util.LinkedHashSet;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Set;
    import java.util.Stack;
    
    import com.baeldung.graph.Graph.Vertex;
    
    public class GraphTraversal {
        static Set<String> depthFirstTraversal(Graph graph, String root) {
            Set<String> visited = new LinkedHashSet<String>();
            Stack<String> stack = new Stack<String>();
            stack.push(root);
            while (!stack.isEmpty()) {
                String vertex = stack.pop();
                if (!visited.contains(vertex)) {
                    visited.add(vertex);
                    for (Vertex v : graph.getAdjVertices(vertex)) {              
                        stack.push(v.label);
                    }
                }
            }
            return visited;
        }
    
        static Set<String> breadthFirstTraversal(Graph graph, String root) {
            Set<String> visited = new LinkedHashSet<String>();
            Queue<String> queue = new LinkedList<String>();
            queue.add(root);
            visited.add(root);
            while (!queue.isEmpty()) {
                String vertex = queue.poll();
                for (Vertex v : graph.getAdjVertices(vertex)) {
                    if (!visited.contains(v.label)) {
                        visited.add(v.label);
                        queue.add(v.label);
                    }
                }
            }
            return visited;
        }
    }

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Если я правильно понял ваш вопрос, вы пытаетесь напечатать Graph и не знаете, где разместить метод main(). Вы можете просто поместить его в класс графа, если вы просто тестируете код, но если вы пытаетесь создать проект с использованием этого класса, вы можете захотеть создать другой класс для хранения метода main().

Печать проста, так как они дают Set<String>. Просто добавьте следующую строку, прежде чем метод вернет посещенные узлы. Это преобразует список посещенных узлов в строку.

System.out.println(visited.toString());

Вы можете проверить это с помощью следующего кода:

static Graph createGraph() {
    Graph graph = new Graph();
    graph.addVertex("Bob");
    graph.addVertex("Alice");
    graph.addVertex("Mark");
    graph.addVertex("Rob");
    graph.addVertex("Maria");
    graph.addEdge("Bob", "Alice");
    graph.addEdge("Bob", "Rob");
    graph.addEdge("Alice", "Mark");
    graph.addEdge("Rob", "Mark");
    graph.addEdge("Alice", "Maria");
    graph.addEdge("Rob", "Maria");
    return graph;
}

public static void main(String[] args) {
    Graph graph = createGraph();
    GraphTraversal.breadthFirstTraversal(graph, "Bob");
}

Что дает:

[Bob, Alice, Rob, Mark, Maria]

Дополнительно , вы отметили, что получаете NullPointerException при попытке добавить вершины. Недостаточно информации, чтобы выяснить, почему вы получаете исключение, но вам может быть полезно проверить модульные тесты, чтобы выяснить, как использовать класс. Модульные тесты: , здесь .

0 голосов
/ 26 июля 2020

Этот пример приведен здесь https://www.baeldung.com/java-graphs

Код объявляет adjVertices, но не создает его. Вместо этого вам нужно добавить ниже, чтобы исправить исключение нулевого указателя.

private Map<Vertex, List<Vertex>> adjVertices = new HashMap<Vertex, List<Vertex>>();
...