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()メソッドはランダムに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]

これを防ぎ、機能させる方法は?問題はどこだ?どんな助けでも大歓迎です。ありがとう...

4

2 に答える 2

1

再帰関数で元の関数を変更しないように一時的に割り当てました

あなたはC/C ++のバックグラウンドを持っていますか?

A = B

Javaでコピーを作成しません。それらは両方とも同じオブジェクトを指します。これは、すべての変数がCポインターのみであるようなものです。

リストのコピーを作成するには、コピーコンストラクターを使用する必要があります。

ArrayList<Integer> pos = new ArrayList<Integer>(positions);
于 2013-01-16T07:43:30.517 に答える
1

これは、 (C / C ++の世界で)ArrayList<Integer> pos = positions;ポインタを割り当てたようなものと見なすことができます。つまり、関数内の元のリストを変更することになります。ArrayListローカルリストで作業するには、新しいリストを作成して操作する必要があります。

ArrayLis<Integer> copiedList = new ArrayList<Integer>(ooriginalList);
于 2013-01-16T07:49:21.410 に答える