0

我想创建一个大矩阵(n x n),其中每个元素对应一个 LinkedList(某些对象)。

我可以

  1. 创建 n*n 个单独的链表并在 eval() 的帮助下在遍历两个维度(或类似的东西)的循环中命名它们,这样最后我将拥有 LinkedList_1_1、LinkedList_1_2 等。每个都有一个唯一的变量名。基本上,完全跳过矩阵。

  2. 创建一个 ArrayList 的 ArrayList,然后将一个链表推入每个元素。

当我想引用单个 LinkedList 时,如果我想节省时间和空间,并且在以后的代码中易于访问,请向我推荐一种方法。方法 1 的访问容易性很差,因为每当我想访问特定的链表时,我都必须使用 eval。

我的直觉告诉我方法 2 是最好的方法,但我究竟如何形成我的初始化呢?

4

1 回答 1

1

既然你知道开始的大小,为什么不直接使用数组呢?不幸的是,Java 泛型阻止数组元素本身成为具体的泛型类型,但您可以使用通配符:

LinkedList<?>[][] lists = new LinkedList<?>[n][n];

或者在内存中效率更高,只需一个数组:

LinkedList<?>[] lists = new LinkedList<?>[n * n];

// Then for access...
lists[y * n + x] = ...;

然后你需要对每个访问进行强制转换 -@SuppressWarnings假设你知道它总是有效的(假设你适当地封装它)。我会把它放在一个地方:

@SuppressWarnings("unchecked")
private LinkedList<Foo> getList(int x, int y) {
    if (lists[y][x] == null) {
        lists[y][x] = new LinkedList<Foo>();
    }
    // Cast won't actually have any effect at execution time. It's
    // just to tell the compiler we know what we're doing.
    return (LinkedList<Foo>) lists[y][x];
}

当然,在这两种情况下,如果需要,您都需要使用空链表填充数组。(如果几个链表最终没有任何节点,您可能希望只考虑延迟填充它们。)

当然不会生成一个包含数百个变量的类。这将使对列表的编程访问变得非常痛苦,并且在许多方面基本上都是一个坏主意。

于 2012-12-03T06:51:26.523 回答