2013-01-16 66 views
0

我有一個需要創建一個數組包含特殊對象的遞歸函數...遞歸函數更改原始數組?

我的自定義對象從該類填充:

public class CategoryItem { 

boolean hasSubCategories = false; 
ArrayList<CategoryItem> subs; 
ArrayList<Integer> positions; 
String categoryName, categoryId; 

// They have setter and getter methods 

} 

這裏是我的遞歸函數:

public ArrayList<CategoryItem> GetLists(ArrayList<Integer> positions, int to) { 

    ArrayList<CategoryItem> items = new ArrayList<CategoryItem>(); 
    for(int i = 0; i < to; i++) { 
     CategoryItem item = new CategoryItem(); 
     item.setHasSubCategories(RandomBool()); 
     item.setCategoryName("Category " + i); 
     item.setCategoryId(RandomId()); 
     ArrayList<Integer> pos = positions; 
     pos.add(i); 
      Log.d(LOG, "positions: " + positions); 
     Log.d(LOG, "pos: " + pos); 
     item.setPositions(pos); 
     if(item.isHasSubCategories()) { 
      item.setSubs(GetLists(item.getPositions(), i)); 
     } 
     items.add(item); 
    } 
    return items; 

} 

在此功能中,RandomBool()方法返回真/假隨機......而RandomId()也並不重要......

問題出在「位置」數組上。我想有每個項目有特定的位置陣列,諸如:

用於第一步驟中,每一個項目都需要有: [0],[1],[2],[3] ...

用於下一步驟中,讓我們假設我們選擇位於3: [3,0],[3,1],[3,2]

但是我發現,當我將項目添加到POS陣列我暫時不會改變遞歸函數中的原始函數,它也被添加到位置數組,即原始數組。因此,第一步的結果如下:每個項目上的 [0,1,2,3]。

和日誌就像:

positions: [] 
pos: [] 
positions: [0] 
pos: [0] 
positions: [0, 1] 
pos: [0, 1] 
positions: [0, 1, 2] 
pos: [0, 1, 2] 
positions: [0, 1, 2, 0] 
pos: [0, 1, 2, 0] 
positions: [0, 1, 2, 0, 1] 
pos: [0, 1, 2, 0, 1] 

如何防止這一點,並使其發揮作用?哪裏有問題? 任何幫助表示讚賞。謝謝...

回答

1

我指派它即暫時不改變對遞歸函數

你是從C/C++背景原來的?

A = B 

不在java中製作副本。他們都會指向同一個對象。就像所有的變量都只有C指針一樣。

您應該使用copy constructor複製列表。

ArrayList<Integer> pos = new ArrayList<Integer>(positions); 
+0

我也試過:ArrayList的 POS =(ArrayList的)positions.clone();但它也沒有幫助...那麼該怎麼做? – yahya

+0

@yahya嘗試複製構造函數,因爲我已經顯示 –

+0

愚蠢的錯誤:)非常感謝你...我會在幾分鐘內接受你的答案... – yahya

1

你可以認爲ArrayList<Integer> pos = positions;像你分配指針的ArrayList(在C/C++的世界),這意味着你將修改自己的函數中原始列表。要在本地列表的工作,你必須創建新的列表和工作與它:

ArrayLis<Integer> copiedList = new ArrayList<Integer>(ooriginalList); 
+0

一個指針,而不是一個引用,列表將不會工作,因爲他的函數期望ArrayList –