1

ここでJava初心者が助けを求めています。問題のコードは次のとおりです。

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を強制的に作成する方法はありますか?

うまくいけば、それは理にかなっています。明確にできる場所を教えてください。ありがとうございました!:)

4

2 に答える 2

3

次の方法で毎回新しい StringBuffer を作成しています。

StringBuffer newSB = new StringBuffer();

ただし、渡された StringBuffer の内容を次の行に追加しているため、毎回同じ StringBuffer を使用しているように見えますが、そうではありません。

newSB.append(buf);

多分それはあなたが望んでいたものではありませんか?デバッガーでこれをステップスルーしてみてください。

于 2010-01-28T05:34:52.730 に答える
1

あなたがやろうとしていることをよりよく説明できますか?

このコード セクションは特に紛らわしいと思います。

        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に追加しているように見えるかもしれませんが、実際には毎回新しいものを作成しています。

問題をもう少し明確にしていただければ、私たちがお手伝いできると思います。

于 2010-02-10T17:15:15.347 に答える