Топологическая сортировка для графа строк (с использованием Map / HashMap) - PullRequest
0 голосов
/ 22 апреля 2020

Я пытался использовать топологическую сортировку на графе, который использует карту двух вершин. Код для графика ниже. Я был в состоянии построить график и использовать TopoSort раньше, но это было на целых числах. Я скопировал этот Toposort в попытке переключить его на строки. Второй блок кода - это то, что у меня есть. Я попытался превратить карту в массив, чтобы я мог использовать итератор, как я делал раньше, но .iterator () не будет работать. Есть ли более простой способ сделать Toposort? как бы это исправить?

График:

public class Graph extends Vertex {

    //creates a map of the adjacent vertices
    public Map<Vertex, List<Vertex>> adjVertices;

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

    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 int getSize() {
        return adjVertices.size();
    }

}

Топологическая сортировка:

public class TopoSort {

    Graph g = new Graph();
    int size = g.getSize();

    //this creates an array from the map
    Object[] adj = g.adjVertices.entrySet().toArray();

    void topologicalSortUtil(int v, boolean visited[], Stack stack) {
        // Mark the current node as visited.
        visited[v] = true;
        int i;

        Iterator<Integer> it = adj[v].iterator();
        while (it.hasNext())
        {
            i = it.next();
            if (!visited[i]) {
                topologicalSortUtil( i, visited, stack );
            }
        }

        // Push current vertex to stack which stores result
        stack.push(new Integer(v));
    }

    // The function to do Topological Sort. It uses
    // recursive topologicalSortUtil()
    void topologicalSort()
    {
        Stack stack = new Stack();

        // Mark all the vertices as not visited
        boolean visited[] = new boolean[size];
        for (int i = 0; i < size; i++)
            visited[i] = false;

        // Call the recursive helper function to store
        // Topological Sort starting from all vertices
        // one by one
        for (int i = 0; i < size; i++) {
            if (visited[i] == false) {
                topologicalSortUtil( i, visited, stack );
            }
        }

        // Print contents of stack
        while (stack.empty()==false) {
            System.out.print(stack.pop() + " " );
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...