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'从未被使用。修改了那行代码。