1

我需要为大学实施 B 树:

我有一个“外部”类 B-Tree,其属性为root和 _degree。表示节点的类被实现为静态成员类:

public class BTree<E> {
    private Node<E> root;
    // the minimal degree
    private int degree;

    public BTree(int degree) {
        if (degree < 2) {
            throw new IllegalArgumentException();
        }

        this.degree = degree;
    }

    // other stuff

    private static class Node<T> {
        T[] elements       = (T[])new Object[degree * 2 - 1];
        Node<T>[] children = (Node<T>[])new Object[degree * 2];
        int size           = 0;
    }
}

所以,现在我的问题是:当我将 Node 类实现为静态成员类时,我无法访问外部类的 degree 属性。

现在我必须选择:

  1. 使 Node 类成为内部类(非静态成员类)或
  2. 为 Node 类创建一个构造函数,并在每次我需要构造 Node 时传入度数。

什么是最好的选择?将其设为内部类意味着节点都将引用 Btree(外部类),但将其设为静态成员类意味着我每次都必须通过学位。

4

3 回答 3

4

我会让它保持静态并通过学位。这样你就Node可以确保不知道任何细节BTree

于 2010-08-17T15:13:17.097 回答
1

如果是我,我会Node公开这个类,这样我就可以在其他包含数据结构中重用它,但这只是我。在这种情况下,我必须通过构造函数传递学位,这对我来说也可以。我不喜欢内部类操纵封闭类成员的想法。我觉得这使课程彼此之间的联系过于紧密。我知道有时这是合适的,但我会尽量避免,这似乎是一个很容易避免的情况。

于 2010-08-17T15:13:31.213 回答
1

有一些参数使它成为静态的,因为它解耦了类。

但我认为 BTree.Node 是来自特定 BTree 的节点。去创建一堆节点(具有随机度数)是没有意义的。你不能有节点,但不能有树。因此,我说的是非静态的。

于 2010-08-17T19:09:15.040 回答