Создание нового объекта в рекурсивной Java-программе - PullRequest
1 голос
/ 28 января 2010

Ява новичка здесь ищет некоторую помощь. Вот этот код:

public void generateCodeTable(Node tree, StringBuffer buf) {
        if (tree != null) {
            StringBuffer newSB = new StringBuffer();
            newSB.append(buf);
            if (tree.key != '$') {
                System.out.print(tree.key + "(" + buf + ") " );
            } else {
                System.out.print(tree.key + "(" + buf + ") " );
            }
            generateCodeTable(tree.getLeftNode(), newSB.append(1));
            generateCodeTable(tree.getRightNode(), newSB.append(0)); 
        }

То, что это делает, постоянно добавляется к ОДНОМУ ИСТОЧНИКУ StringBuffer на каждой итерации рекурсивного цикла, когда на самом деле то, что я хотел бы сделать, это каждый раз создавать новый StringBuffer. Любой способ заставить новый StringBuffer быть создан?

Надеюсь, это имело смысл; дайте мне знать, где я могу уточнить. Спасибо! :)

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Вы создаете новый StringBuffer каждый раз через:

StringBuffer newSB = new StringBuffer();

Но вы добавляете содержимое переданного в StringBuffer в следующую строку, поэтому похоже, что вы каждый раз используете один и тот же StringBuffer, но это не так:

newSB.append(buf);

Может быть, это не то, что вы хотели? Попробуйте пройти через это с помощью отладчика.

1 голос
/ 10 февраля 2010

Не могли бы вы лучше объяснить, что вы пытаетесь сделать?

Я нахожу этот раздел кода особенно запутанным.

        if (tree.key != '$') {
            System.out.print(tree.key + "(" + buf + ") " );
        } else {
            System.out.print(tree.key + "(" + buf + ") " );
        }

Вы собираетесь печатать одно и то же, независимо от того, по какому пути идет IF / ELSE, так зачем нужна условная часть?

Также, когда вы делаете следующее:

StringBuffer newSB = new StringBuffer();
newSB.append(buf);

Вы действительно создаете новый StringBuffer объект, локально ограниченный этой функцией. Однако вы добавляете содержимое параметра buf к новому StringBuffer . Это может создать иллюзию того, что вы добавляете один и тот же StringBuffer на каждой итерации функции, но вы действительно создаете новую каждый раз.

Если бы вы могли прояснить проблему немного больше, я думаю, мы могли бы помочь.

...