2013-06-22 63 views
3

这是我的情况,我想为我正在处理的3d项目创建一个矩阵缓冲区。如何使用ArrayList和Array编写三维矩阵

很多人对堆栈溢出提议做这样

ArrayList<ArrayList<object>> 

然而事情这个结构是造成问题,因为我需要一个固定大小的矩阵和我知道的影响是add(i,object)作为对的复杂性操作。另一方面,我的矩阵的最后一个嵌套层次需要具有可变大小,所以如果对象位于相同位置,它只会将其自身添加到堆栈中。

回答

2

如果你需要一个长度可变的第三维矩阵,为什么不做ArrayList [] []?

显然,你不能实例化一个通用的矩阵,但可以从原始类型强制转换为Object(假设这是你想要的)是这样的:

ArrayList<Object>[][] box = (ArrayList<Object>[][])new ArrayList[length][width]; 

这将导致一个固定大小具有可变长度第三维的矩阵。不过要记住用ArrayList填充矩阵,因为整个矩阵将被填充为null。

+0

好铸造听起来像一个可能的解决方案。我目前正在做类似的事情,但我没有投射。我觉得应该有更好的解决办法吗?是不是有一个类似于数组的结构对象? –

+0

与数组(即列表)类似的集合是LinkedList,ArrayList和Vector。 ArrayList优于Vector,并且通常ArrayList比LinkedList具有更快的访问速度,并且使用的内存少得多,所以它通常是您想要的。如果你对这个第三维有更多具体的约束,比如只在前面或后面添加,你可以使用ArrayDeque或Stack,除此之外你真的使用ArrayList。 –

1

可变长度第三维可以由许多不同的集合处理。如果你的第三维真的像一个堆栈(或者甚至是一个Queue/Deque),那么我会使用LinkedList来处理它,因为它可以从集合的正面/背面添加和移除对象的速度。

为了创建类型的列表E你可以写的二维矩阵:

LinkedList<E>[][] matrix = new LinkedList[length][width]; 

然后之后,我会建议实例的所有名单,像这样为了防止空指针问题:

for(int i = 0; i < matrix.length; i++) 
    for(int j = 0; j < matrix[0].length; j++) 
     matrix[i][j] = new LinkedList<>(); 

我假设你正在使用的Java 7,如果没有,干脆把类型(E)到尖括号实例的每个元素时。我希望这可以帮助,并有趣的编码! =)