1

設定時に「フラグ」を保存する方法。たとえば、私がブロックにいるとき

if (hashFunction(value) == hashFunction(node.value))
{

    flag = true;
    return flag; 

}

デバッグフラグ=trueですが、次のステップとポインタは

if (hashFunction(value) < hashFunction(node.value))
    {
        if (node.left != null)
        {

            findPrivate(value, node.left);------THERE

        } else
        {
            flag = false;
            return flag;
        }
    }

その結果、私のメソッドはfalseを返します。それを修正する方法は?英語でごめんなさい。完全なコードは次のとおりです。

    private boolean findPrivate(T value, Node node)
{

    if (node == null)
    {
        flag = false;
        return flag;

    }
    if (hashFunction(value) == hashFunction(node.value))
    {

        flag = true;
        return flag; 

    }

    if (hashFunction(value) > hashFunction(node.value))
    {
        if (node.rigth != null)
        {
            findPrivate(value, node.rigth);
        } else
        {

            flag = false;
            System.out.println("value= " + value + " " + flag);
            return flag;
        }
    }

    if (hashFunction(value) < hashFunction(node.value))
    {
        if (node.left != null)
        {

            findPrivate(value, node.left);

        } else
        {
            flag = false;
            return flag;
        }
    }
    return flag;
}
4

2 に答える 2

4

問題は、再帰するときに、戻り値を無視していることです。

findPrivate(value, node.left);

詳細については説明していませんが、発生するたびに次のように変更できる可能性があります。

return findPrivate(value, node.left);

また、変数を完全に削除することをお勧めします。flagとにかくどこで宣言されているかは明確ではありませんが、おそらく使用すべきではないようです。代わりに、値を直接返します。例えば:

if (node.left != null)
{
    return findPrivate(value, node.left);
} else
{
    return false;
}

...これは簡単にリファクタリングできます:

return node.left != null ? findPrivate(value, node.left) : false;

false実際、がnullの場合はすでに戻っているのでnode、次を使用できます。

return findPrivate(value, node.left);

その場合。私はあなたがそれらの線に沿ってかなり簡単にあなたのコードをリファクタリングできると思います...

于 2013-03-24T14:49:14.700 に答える
0

再帰呼び出しから値を返す必要があります。

private static final class Node<T> {

    protected T value;
    protected Node<T> right;
    protected Node<T> left;

    private boolean findPrivate(T value, Node<T> node) {
        if (node == null) {
            return false;
        }
        if (hashFunction(value) == hashFunction(node.value)) {
            return true;
        }
        if (hashFunction(value) > hashFunction(node.value)) {
            if (node.right != null) {
                return findPrivate(value, node.right);
            } else {
                return false;
            }
        }
        if (hashFunction(value) < hashFunction(node.value)) {
            if (node.left != null) {
                return findPrivate(value, node.left);
            } else {
                return false;
            }
        }
        throw new UnsupportedOperationException("cannot compare hashCodes");
    }

    private int hashFunction(T value) {
        //stuff
    }
}

実際にを保存する必要はありません。値を保存するflagだけです。return

于 2013-03-24T14:55:16.033 に答える