递归函数改变原始数组?

时间:2013-01-16 07:39:23

标签: java arrays recursion

我有一个递归函数,需要创建一个由特殊对象组成的数组......

我的自定义对象是从这个类填充的:

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()方法随机返回true / false ...而且RandomId()也不重要......

问题在于“位置”数组。我希望每个项目都有特定的位置数组,例如:

第一步,每个项目都需要: [0],[1],[2],[3] ......

下一步,让我们假设我们选择定位3: [3,0],[3,1],[3,2]

但是我发现当我向pos数组添加一个项目时,我指定它暂时不在递归函数上更改原始项目,它也被添加到position数组,即原始数组。所以第一步的结果是: 每个项目都有[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]

如何防止这种情况并使其有效?问题出在哪儿? 任何帮助表示赞赏。感谢...

2 个答案:

答案 0 :(得分:1)

  

我临时分配它不要在递归函数上改变原来的

你是来自C / C ++背景吗?

A = B

不在java中制作副本。它们都指向同一个对象。它有点像所有变量只是C指针。

您应该使用copy constructor制作列表的副本。

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

答案 1 :(得分:1)

您可以认为ArrayList<Integer> pos = positions;就像您指定了ArrayList的指针(在C / C ++世界中),这意味着您将修改函数内的原始列表。要在本地列表上工作,您必须创建新列表并使用它:

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