2013-10-16 69 views
0

我一直在一個項目上工作,我一直面臨着Java中的Arraylist問題。 問題是Prim算法 1.隨機地產生圖形 2.製作鄰居的ArrayList爲每個頂點 3.傳遞數組列表到2個不同的功能在一個地方的Java Arraylist問題更改導致另一個地方

問題: - 當我做出改變在ArrayList的在一類其反映的也是其他類。如何解決它?在此先感謝。在我致電mst.java g.getneighbourlist()時,它工作正常。但是現在當我使用相同的g.getbeighbourlist()調用mstFheap.java時,其不同的neibourlist是指從第二個選擇的所有邊被選中。

  //main.java 

       public class main{ 
        GenGraph g = new GenGraph(size, density); 
     g.makeGraph(); 
     g.print(); 
     // calling for finding mst 
     mst m= new mst(g.getNeighbourlist(),size); 
     mstFheap m1= new mstFheap(g.getNeighbourlist(), size); 

     m.start(); // starts the algo 
     m.print(); // print mst 
     m1.print(); // In second class just printing the neibhour list 
        } 

     //mst.java 

     public class mst { 
private List<LinkedList<edge>> neighbour =null; 
private LinkedList<edge> mst = new LinkedList<edge>(); 
private int [] traker = null; 
private int totalCost =0; 
private int size=0; 
private boolean path=false; 

public mst(List<LinkedList<edge>> list,int x) 
{ 
    this.neighbour=new ArrayList<LinkedList<edge>>(list);; 
    this.size=x; 
    this.traker= new int[size]; 
    for(int i=0;i<size;i++){traker[i]=0;} 

} 

      public void start() { 

    List<Integer> subGroup = new ArrayList<Integer>(); 
    Random ran= new Random(); 
    int val= ran.nextInt(size); 
    subGroup.add(val); 
    traker[val]=1; 
    while(!path){ 
     edge e= minCost(subGroup); 
     totalCost+= e.weight; 
     subGroup.add(e.v2); 
     neighbour.get(e.v1).remove(e); 
     edge temp = new edge(e.v2,e.v1,e.weight); 
     neighbour.get(e.v2).remove(temp); 
     traker[e.v1]=1; 
     traker[e.v2]=1; 
     mst.add(e); 
     if(subGroup.size()==size) path=true; 
    } 

} 

     //mstFheap.java 

      public class mstFheap { 
     private fHeap f; 
     private double totalCost =0; 
     private double [] keyList= null; 

//Graph elements 
private int size=0; 
private List<LinkedList<edge>> neighbour =null; 
public double cost(){return totalCost;} 


public mstFheap(List<LinkedList<edge>> list,int size){ 
    f=new fHeap(); 
    neighbour=new ArrayList<LinkedList<edge>>(list); 
    this.size=size; 
    keyList=new double[size];  
     for(int i=0;i<size;i++){ 
      keyList[i]= Double.POSITIVE_INFINITY; 
      fHeapNode temp= new fHeapNode(i, keyList[i]); 
      f.insert(temp, keyList[i]); 
      } 
    } 

      public void print(){ 
    System.out.print(" Keylist:- "); 
    for(int i=0;i<neighbour.size();i++){ 
     System.out.print(neighbour.get(i).size()+" "); 
    } 

} 
+3

如果我正確理解你的問題(一個大的If),你很可能在幾個地方共享一個列表,而不是爲每個實例創建一個新列表。此外,您的代碼被格式化爲不可讀,所以我不會嘗試找到發生這種情況的地方。 – Kayaman

回答

2

嘗試:

mst m= new mst(new ArrayList(g.getNeighbourlist()),size); 
mstFheap m1= new mstFheap(new ArrayList(g.getNeighbourlist()), size); 

,這將使列表的副本每種算法。

請注意:請以大寫字母開頭。並考慮使用人類可讀的名稱。 「g」是Graph,所以爲什麼不叫它「圖」?

編輯:我剛纔看到,它是一個「列表清單」。所以你可以調整你的getNeighbourlist()方法,所以它會返回一個「深層副本」。這意味着:您將不得不返回列表副本的新副本列表。

+0

它不工作。 –

+0

你能詳細點嗎?它以什麼方式不起作用?它會拋出異常嗎? – Fildor

+0

@RohitGarg看我的編輯。 – Fildor

相關問題