Dijkstra无可比节点Java

Dijkstra无可比节点Java,java,debugging,dijkstra,comparable,Java,Debugging,Dijkstra,Comparable,这是我在这里问的第一个问题,如果我做错了什么,请评论: 我有一个讨厌的项目要完成。我必须为从节点开始到节点结束实现Dijkstra算法。图由连接节点的边的长度加权。一个问题是,图、边和节点类没有实现Compariable,节点类不包含节点的Weighth或pervious Node之类的内容。我不允许在Node、Graph或Edge类中更改任何内容 因此,我试图通过在RoutingAlgoritm中使用一个私有类来实现Dijkstra,该类包含距离、前一个节点等 不管怎样,现在我遇到了一个问题,

这是我在这里问的第一个问题,如果我做错了什么,请评论:

我有一个讨厌的项目要完成。我必须为从节点开始到节点结束实现Dijkstra算法。图由连接节点的边的长度加权。一个问题是,图、边和节点类没有实现Compariable,节点类不包含节点的Weighth或pervious Node之类的内容。我不允许在Node、Graph或Edge类中更改任何内容

因此,我试图通过在RoutingAlgoritm中使用一个私有类来实现Dijkstra,该类包含距离、前一个节点等

不管怎样,现在我遇到了一个问题,我的目标节点没有上一个节点,我不知道为什么。我希望你能帮助我

    private List<Node> dijkstra( Graph g, NodeForDijkstra start, NodeForDijkstra target, TravelType tt) throws NoSuchRouteException{
    PriorityQueue<NodeForDijkstra> q = new PriorityQueue<NodeForDijkstra>();
    start.distance = 0.;
    start.prev = null;
    ArrayList<Node> explored = new ArrayList<Node>();
    q.add( start );
    if( q.isEmpty() ){
        throw new NoSuchRouteException();
    }
    while( !q.isEmpty() ){
        NodeForDijkstra n = q.poll();
        Node v = n.getNode;
        if( v.getId() == target.getNode.getId() ){
            return path(target);
        }
        explored.add( v );
        for( Edge e : v ){
            if( e.allowsTravelType(tt, Direction.FORWARD) ){
                Node puf = e.getEnd();
                NodeForDijkstra newNode = new NodeForDijkstra(puf);
                double newdist = n.distance + e.getLength(); 
                if( !explored.contains(puf) ){
                    newNode.prev = n;
                    System.out.println( newNode.getNode.getId()+ " | " + newNode.prev.getNode.getId() );
                    if( !q.contains( newNode ) ){
                        newNode.distance = newdist;
                        q.add(newNode);
                    }else if( newNode.distance > newdist ){
                        System.out.println( "foo" );
                        q.remove(n);
                        newNode.distance = newdist;
                        q.add(newNode);
                    }
                }
            }
        }
    }
    return path(target);
}

private List<Node> path( NodeForDijkstra target ){
    List<Node> path = new ArrayList<Node>();
    for( NodeForDijkstra n = target; n!= null; n = n.prev ){
        path.add( n.getNode );
        System.out.println(n.getNode.getId());
        System.out.println( "bar" );
    }
    Collections.reverse(path);
    return path;
}

private class NodeForDijkstra implements Comparable<NodeForDijkstra>{

    public double distance = Double.POSITIVE_INFINITY;
    public Node getNode;
    public NodeForDijkstra prev = null;

    public NodeForDijkstra( Node n ) {
        this.getNode = n;
    }

    @Override
    public int compareTo(NodeForDijkstra o) {
        return Double.compare(distance, o.distance);
    }

}

您的目标节点没有获得上一个节点是什么意思?如果有一个声明没有达到你的预期,那么你可以指出该声明是什么,你希望它能做什么,以及它在做什么,这会有所帮助。如果没有它,我们很难确切地理解您的问题是什么。我所说的ist是指我的目标的前一个节点保持为空