2017-11-28 37 views
-2

優先度キューには、優先度キューに要素が存在しても常にメソッドがfalseを返します。私はどのようにしてcompareメソッドをオーバーライドするのか分からない。これは、隣接リストを使用するDijkstraアルゴリズムのためのプログラムです。 このコードで@Override compareメソッドを実装する方法。優先度キューにはeleumeetが優先キューに存在しますが、常にfalseが返されます。

import java.util.*; 
class dijkstra{ 
class AdjListNode{ 
    private int vertex,weight; 
    AdjListNode(int v,int w){vertex=v;weight=w;} 
    int getv(){return vertex;} 
    int getw(){return weight;}   
@Override 
    public boolean equals(AdjListNode obj){ 
     return (obj.getv() == this.vertex && obj.getw()==this.weight); 
    } 
} 
class Graph{ 
    private int V; 
    private LinkedList<AdjListNode> adj[]; 
    Graph(int v){ 
     V=v; 
     adj=new LinkedList[v]; 
     for(int i=0;i<V;i++){ 
      adj[i]=new LinkedList<AdjListNode>(); 
     } 
    } 
    void addEdge(int u,int v,int w){ 
     //undirected graph so edges are added bothways 
     AdjListNode node1=new AdjListNode(v,w); 
     adj[u].add(node1); 
    } 
    void print(){ 
     for(int i=0;i<V;i++){ 
      Iterator<AdjListNode> itr=adj[i].listIterator(); 
      System.out.print(i+"==>"); 
      while(itr.hasNext()){ 
       AdjListNode node=itr.next(); 
       System.out.print("("+node.getv()+","+node.getw()+") "); 
      } 
      System.out.println(); 
     } 
    } 
    void sssp(int src){ 
     PriorityQueue<AdjListNode> q = new PriorityQueue<AdjListNode>(V, new Comparator<AdjListNode>() { 
       @Override 
       public int compare(AdjListNode node1, AdjListNode node2) { 
        return Integer.compare(node1.getw(), node2.getw()); 
       } 
     }); 
     q.add(new AdjListNode(0,0)); 
     int dist[]=new int[V]; 
     Arrays.fill(dist,Integer.MAX_VALUE); 
     dist[src]=0; 
     while(q.size()!=0){ 
      AdjListNode node=q.peek(); 
      Iterator<AdjListNode> itr=adj[node.getv()].listIterator(); 
      q.poll(); 
      while(itr.hasNext()){ 
       AdjListNode temp=itr.next(); 
       if(dist[temp.getv()]>dist[node.getv()]+temp.getw()){ 
        int oldweight=dist[temp.getv()]; 
        dist[temp.getv()]=dist[node.getv()]+temp.getw(); 
        //System.out.println(node.getv()+" "+temp.getv()+" "+oldweight+" "+q.contains(new AdjListNode(temp.getv(),oldweight))); 
        if(q.contains(new AdjListNode(temp.getv(),oldweight))){ 
         System.out.println("yes"); 
         q.remove(new AdjListNode(temp.getv(),oldweight)); 
         q.add(new AdjListNode(temp.getv(),dist[temp.getv()])); 
        }       
        else{ 
         q.add(new AdjListNode(temp.getv(),dist[temp.getv()])); 
         //System.out.println(q.contains(new AdjListNode(temp.getv(),dist[temp.getv()]))); 
        } 
       } 
      } 
     } 
     for(int i=0;i<V;i++) 
      System.out.print(dist[i]+" "); 
    } 

} 
Graph newGraph(int vertices){ 
    return new Graph(vertices); 
} 
public static void main(String[] args){ 
    dijkstra d=new dijkstra(); 
    Graph g=d.newGraph(6); 
    g.addEdge(0,1,2); 
    g.addEdge(0,3,30); 
    g.addEdge(0,5,40); 
    g.addEdge(0,4,5); 
    g.addEdge(0,2,60); 
    g.addEdge(1,4,11); 
    g.addEdge(1,3,5); 
    g.addEdge(1,2,2); 
    g.addEdge(1,5,4); 
    g.addEdge(2,1,3); 
    g.addEdge(2,3,1); 
    g.addEdge(2,4,3); 
    g.addEdge(3,4,3); 
    g.addEdge(3,5,11); 
    g.addEdge(4,3,2); 
    g.addEdge(4,5,12); 
    g.print(); 
    g.sssp(0); 
} 

}

出力がエラーを示すと、正しい結果を返しますが、そこに行くいくつかのエラーがあるとメソッドが動作していないが含まれていません。正しいアプローチを提案してください。

答えて

0

この特定のケースでは、私はメソッドは直接呼び出されていないと考えているが、それはそれは良い習慣だけれどもあなたは、あなたのequals実装と一貫性のある方法で、同様AdjListNode(およびhashCodeequalsメソッドをオーバーライドする必要があります将来的に多くの問題を防ぐことができます)。

containsメソッドは、キュー内の2つのオブジェクトが同一であるかどうかをチェックするためにこのメソッドを必要とし、Objectのデフォルトの実装は、それらがまったく同じインスタンスであるかどうかをチェックします。 )

+0

私はこれを試しましたが、エラーが発生しました...メソッドが実装していないか、スーパータイプからメソッドをオーバーライドしました – gshivam63

+0

あなたの試行した 'equals'実装を表示できますか? –

+1

'equals'をオーバーライドすると、' equals'と一貫して 'hashCode'も常にオーバーライドします。 –

関連する問題