2016-08-18 248 views
-1
public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Scanner sc = new Scanner(System.in); 
     int source= sc.nextInt(); 
     int dest = sc.nextInt(); 
     int noOfVertices= sc.nextInt(); 
     int noofEdges= sc.nextInt(); 
     int GreeLights[] = new int[noOfVertices+1]; 
     HashMap<edge, Integer> edgeInfo= new HashMap<>(); 
     Graph g= new Graph(); 
     for(int i=1;i<=noOfVertices;i++){ 
      GreeLights[i]=sc.nextInt(); 
     } 

     for(int i=1;i<=noofEdges;i++){ 
      int x= sc.nextInt(); 
      int y= sc.nextInt(); 
      int weight= sc.nextInt(); 
      edge e= new edge(x,y); 
      edgeInfo.put(e, weight); 
      g.adj.put(x, new LinkedList<Integer>()); 
      g.addNeighbour(x, y); 
     } 

     boolean visited[]= new boolean[noOfVertices+1]; 
     int distance[]= new int[noOfVertices+1]; 

     for(int i=1;i<=noOfVertices;i++){ 
      visited[i]=false; 
      distance[i]=1000; 
     } 

     distance[source]=0; 

     for(int i=1;i<=noOfVertices;i++){ 
      int min=1000; 
      int minIndex=-1; 
      for(int j=1;j<=noOfVertices;j++){ 
       if(distance[j]<min){ 
        min=distance[j]; 
        minIndex=j; 
       } 
      }    
      visited[minIndex]=true; 
      LinkedList<Integer> LL= g.getNeighbors(minIndex); 
      for(int x:LL){ 
       if(visited[x]!=true){ 
        edge e = new edge(minIndex,x); 
        int weightofEdge=edgeInfo.get(e); //Null pointer exception occuring here 
        int distancetoNeighbour =  
       distance[minIndex]+weightofEdge; 
        if(distance[x]>distancetoNeighbour){ 
         int greenTime=GreeLights[x]; 
         int wait=0; 
         for(int j=0;j<distancetoNeighbour;){ 
          j=j+greenTime; 
          wait=j; 
         } 
         wait-=distancetoNeighbour; 
         if(wait==0){ 
          distance[x]=distancetoNeighbour; 
         } 
         else{ 
          distance[x]=distancetoNeighbour+wait; 
         } 
        } 
       } 
      } 
     } 


     System.out.println(distance[dest]); 

    } 

我創建了一個散列表,將邊緣存儲爲鍵,並將該邊的權值存儲爲值。現在應用Dijkstras算法來解決我需要得到與邊相對應的權值的問題。所以我創建了一個新的邊,其頂點與hashmap中存在的所需邊相同,但是當我調用edgeInfo.get()函數來獲取該邊的權值時,它會顯示NullPointerException ...任何人都可以幫助我...空指針異常

我的邊緣種類是: -

class edge{ 
    int x; 
int y; 

public edge(int x,int y){ 
    this.x=x; 
    this.y=y; 

} 

public boolean equals(edge e){ 
    return (this.x==e.x && this.y==e.y); 
} 

} 
+0

提的編程語言將是很好的返回值。 – JJJ

+0

對不起兄弟我的錯 –

+0

什麼是堆棧跟蹤? –

回答

0
edge e = new edge(minIndex,x); 
int weightofEdge=edgeInfo.get(e); 

edgeInfo不可能包含E,因爲E具有剛剛創建,並從未投入散列圖。所以對get()的調用返回一個空整數,代碼試圖取消分配給int weightofEdge,並因此返回NullPointerException。

+0

,那麼應該如何獲取值該邊緣,因爲最初我已經在edgeInfo中插入了這些邊緣和相應的值.... –

+0

您沒有將該邊緣放入hashmap中,因爲您剛剛在上面的t行上創建了它他打電話。您可能以前已經將相同的x和y值放在一條邊上,但該邊與您剛創建的邊不同。如果你的邊界類(NB:遵循約定,並且以大寫字母開始類名!)將覆蓋hashcode()爲@azurefrog建議的值,那麼只要兩個邊界實例產生相同哈希值。 – FredK

+0

而且您不應該先使用HashMap.get()調用的返回值,而是先檢查返回值是否爲空。 – FredK

0

你必須實現哈希函數,因此根據x和y 的方式,你正在做它,你只能得到

class edge{ 
      int x; 
      int y; 

      public edge(int x,int y){ 
        this.x=x; 
        this.y=y; 

      } 

      public boolean equals(edge e){ 
        return (this.x==e.x && this.y==e.y); 
      } 

      // overWride hash function 
      @Override 
      public int hashCode() { 
        String s = new String(Integer.toString(x)+Integer.toString(y));// you can change this if you like 
      return s.hashCode(); 
      } 

}

+0

因此,對於邊緣hashCode()將返回一個唯一的數字......但如果你能告訴我它將如何影響我的程序,那麼這將是真正有用的...謝謝你提前。 –