特別なオブジェクトで構成される配列を作成する必要がある再帰関数があります...
私のカスタムオブジェクトは、このクラスから入力されます。
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配列に項目を追加すると、元の位置配列にも追加されることがわかりました。したがって、最初のステップの結果は、すべてのアイテムで[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]
これを防ぎ、機能させる方法は?問題はどこだ?どんな助けでも大歓迎です。ありがとう...