【问题标题】:How to program a 3-dimensional Matrix using ArrayList and Array如何使用 ArrayList 和 Array 编写 3 维矩阵
【发布时间】:2013-06-19 06:50:28
【问题描述】:

这是我的情况,我想为我正在处理的 3d 项目创建一个矩阵缓冲区。

Stack Overflow 上的很多人都在提议做这样的事情

ArrayList<ArrayList<object>>

但是,这种结构会导致问题,因为我需要一个固定大小的矩阵,并且我知道 add(i,object) 对操作复杂性的影响。另一方面,我的矩阵的最后一个嵌套级别需要具有可变大小,因此如果对象位于同一位置,它只会将其自身添加到堆栈中。

【问题讨论】:

    标签: java arrays matrix arraylist


    【解决方案1】:

    如果您需要具有可变长度第三维的矩阵,为什么不使用 ArrayList[][]?

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

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

    这将产生一个具有可变长度第三维的固定大小矩阵。不过记得用 ArrayList 填充矩阵,因为整个矩阵一开始就会用 null 填充。

    【讨论】:

    • 好的投射听起来像是一个可能的解决方案。我目前正在做类似的事情,但我没有选角。我觉得应该有更好的解决方案不是吗?有没有与数组结构相似的集合对象?
    • 与数组(即列表)类似的Collection有LinkedList、ArrayList、Vector。 ArrayList 比 Vector 更可取,而且通常 ArrayList 的访问速度比 LinkedList 快得多,而且使用的内存要少得多,所以它通常是你想要的。如果你对这个第三维有更具体的限制,比如只在前面或后面添加,你可以使用 ArrayDeque 或 Stack,除此之外你真的使用 ArrayList。
    【解决方案2】:

    可变长度的第三维可以由许多不同的集合处理。如果您的第 3 维真的像堆栈(甚至是队列/双端队列),那么我会使用 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) 放入尖括号中。我希望这会有所帮助,并且玩得开心! =)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 2015-11-29
      • 1970-01-01
      相关资源
      最近更新 更多