我有一个递归函数,需要创建一个由特殊对象组成的数组......
我的自定义对象是从这个类填充的:
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]
如何防止这种情况并使其有效?问题出在哪儿? 任何帮助表示赞赏。感谢...
答案 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);