Java中的拓扑排序

Java中的拓扑排序,java,graph,topological-sort,Java,Graph,Topological Sort,我正在尝试为字符图实现拓扑排序 这是我的密码 public class Graph { private int vertices; private HashMap<Character, LinkedList<Character>> adjList; private boolean isDirected; public Graph(int vertices){ this.vertices = vertices;

我正在尝试为字符图实现拓扑排序

这是我的密码

public class Graph {

    private int vertices;
    private HashMap<Character, LinkedList<Character>> adjList;
    private boolean isDirected;

    public Graph(int vertices){
        this.vertices = vertices;
        adjList = new HashMap<>();
        isDirected = true;
    }

    public void addEdge(Character from, Character to){

        if(adjList.containsKey(from)){
            LinkedList<Character> l = adjList.get(from);
            l.add(to);
        }else{
            LinkedList l = new LinkedList();
            l.add(to);
            adjList.put(from, l);
        }
    }

    public Deque<Character> topologicalSort(){
        Deque<Character> stack = new ArrayDeque<>();
        Set<Character> visited = new HashSet<>();
        Iterator itr = adjList.entrySet().iterator();
        while(itr.hasNext()){
            Map.Entry pair = (Map.Entry) itr.next();
            LinkedList<Character> l = (LinkedList<Character>) pair.getValue();
            ListIterator<Character> litr = l.listIterator();
            while(litr.hasNext()){
                Character key = (Character)litr.next();
                if(visited.contains(key)) continue;
                else{
                    topSortUtil(key, stack, visited);

                }
            }
        }
            return stack;

    }

    public void topSortUtil(Character key, Deque<Character> stack, Set<Character> visited){
        visited.add(key);
        LinkedList<Character> list = adjList.get(key);
        ListIterator<Character> litr = list.listIterator();
        while(litr.hasNext()){
            Character childKey = (Character) litr.next();
            if(visited.contains(childKey)) continue;
            else topSortUtil(childKey,stack, visited);
        }
        stack.offerFirst(key);
    }




}
公共类图{
私有int顶点;
私有哈希表;
私有布尔是定向的;
公共图(int顶点){
这个。顶点=顶点;
adjList=新的HashMap();
isDirected=true;
}
公共无效添加(字符从,字符到){
if(调整列表容器(从)){
LinkedList l=adjList.get(从);
l、 增加(至);
}否则{
LinkedList l=新建LinkedList();
l、 增加(至);
adjList.put(from,l);
}
}
公共数据拓扑排序(){
Deque stack=new ArrayDeque();
Set visted=新HashSet();
迭代器itr=adjList.entrySet().Iterator();
while(itr.hasNext()){
Map.Entry对=(Map.Entry)itr.next();
LinkedList l=(LinkedList)pair.getValue();
ListIterator litr=l.ListIterator();
while(litr.hasNext()){
字符键=(字符)litr.next();
如果(已访问。包含(键))继续;
否则{
topSortUtil(键、堆栈、访问);
}
}
}
返回栈;
}
public void topSortUtil(字符键、Deque堆栈、访问集){
已访问。添加(键);
LinkedList=adjList.get(键);
ListIterator litr=list.ListIterator();
while(litr.hasNext()){
Character childKey=(Character)litr.next();
如果(visitored.contains(childKey))继续;
else-topSortUtil(childKey、stack、visited);
}
stack.offerFirst(键);
}
}
我用来测试的客户端代码如下所示

public class Main {

    public static void main(String[] args) {
    // write your code here

        Graph graph = new Graph(5);
        graph.addEdge('a', 'b');
        graph.addEdge('a', 'c');
        graph.addEdge('a', 'd');
        graph.addEdge('b', 'd');
        graph.addEdge('b', 'e');
        graph.addEdge('c', 'e');

        Deque<Character> stack = graph.topologicalSort();
        while(!stack.isEmpty()){
            System.out.print(stack.pop() + " ");
        }
    }
}
公共类主{
公共静态void main(字符串[]args){
//在这里编写代码
图形=新图形(5);
图.附录('a','b');
图.附录('a','c');
图.附录('a','d');
图.附录('b','d');
图.附录('b','e');
图.附录('c','e');
Deque stack=graph.topologicalSort();
而(!stack.isEmpty()){
System.out.print(stack.pop()+);
}
}
}

问题是我在控制台上没有得到任何输出。我似乎不知道这个bug是什么。感谢您的帮助。

您的程序在
topSortUtil
上崩溃,因为
LinkedList=adjList.get(key)key='d'
时调用code>。由于
d
没有传出边,
list
null
,因此当您到达此行时
ListIterator litr=list.ListIterator()
,您正在调用
null
上的一个方法,该方法抛出一个
NullPointerException

topSortUtil
方法更改为类似以下内容=>

public void topSortUtil(Character key, Deque<Character> stack, Set<Character> visited){
    visited.add(key);
    ListIterator<Character> litr ;

    LinkedList<Character> list = adjList.get(key);
    if(list!=null) //null check
    {
    litr = list.listIterator();

    while(litr.hasNext()){
        Character childKey = (Character) litr.next();
        if(visited.contains(childKey)) continue;
        else topSortUtil(childKey,stack, visited);
    }
    }

    stack.offerFirst(key);
}
public void topSortUtil(字符键、数据堆栈、访问集){
已访问。添加(键);
列表迭代器litr;
LinkedList=adjList.get(键);
if(list!=null)//null检查
{
litr=list.listIterator();
while(litr.hasNext()){
Character childKey=(Character)litr.next();
如果(visitored.contains(childKey))继续;
else-topSortUtil(childKey、stack、visited);
}
}
stack.offerFirst(键);
}

您是否使用一个非常小的
图形进行调试
?是的,代码在util函数处中断,但似乎无法理解原因。这是如何中断的?
topSortUtil
仅由
topSortUtil
本身使用。你的代码永远无法到达它。你的主类堆栈是空的,这就是为什么。方法“topologicalSort”只是初始化空堆栈并返回它。Methond'topSortUtil'从未被使用。修改了那行代码。