在Java中“包装”ArrayList的最佳方法?

时间:2011-11-07 11:07:17

标签: java arraylist multidimensional-array

我想在Java中用合适的数据结构表示类似矩阵的数据。该矩阵的尺寸取决于用户输入。一种方法可能是使用“魔术”最大常数,并使用简单的多维数组。但是对数据的操作在很大程度上取决于维度,我想避免使用固定数组,因为我总是需要跟踪使用的和最大的维度。当然,更动态的方法是定义类似

的内容
private ArrayList<ArrayList<ArrayList<Point>>> arr3d = new ArrayList<ArrayList<ArrayList<Element>>>();

我认为这是不可接受的丑陋。最好定义自定义数据结构,即一维ArrayList(或Vector),然后以某种方式将其包装,即将指定为[i,j,k]的访问映射到该单个列表的某个元素。是否可以覆盖运算符[]?如何有效地做到这一点?是否有一些我可以依赖的现有库或代码?

PS:我认为这可能是一个常见的问题,但尽管付出了最大的努力,我还没有找到现有的问题。如果我错过了一些答案,请提前道歉。

3 个答案:

答案 0 :(得分:4)

为什么不创建自己的类来包装它?它可以在内部包含您的3d列表,但是您只公开“用户友好”的方法来访问和设置元素。

不,在Java中,不可能重载[]

快速帮助:

public class Cube<T> {
    private final List<List<List<T>>> elements = new ArrayList<List<List<T>>>();

    public T get(final int x, final int y, final int z) {
        if (elements.size() > x) {
            final List<List<T>> rowx = elements.get(x);
            if (rowx.size() > y) {
                final List<T> rowy = rowx.get(y);
                if (rowy.size() > z) {
                    return rowy.get(z);
                }
            }
        }
        return null;
    }
} 

如果您不担心可读性,甚至可以在一行中完成:

public T get(final int x, final int y, final int z) {
    return (elements.size() > x && elements.get(x).size() > y && elements.get(x).get(y).size() > z ? elements.get(x).get(y).get(z) : null);
}

你需要put方法,在需要时创建行(作为ArrayList)。

答案 1 :(得分:2)

从您的问题中不能立即清楚您对矩阵的最大维度的意义。它总是三维的,还是根据用户的输入可以是N维的?

假设它是3维的,它是否经常?每个矩阵[i,j],[i,k]和[j,k]是否与其他矩阵相同?

如果是这样,您可以将结构建模为单个平面列表,其中包含两个变量 - 一个表示矩阵单个级别中行的长度,另一个表示3d结构中网格的长度。整数除法将为您提供结构中的三维位置:

给定idx n,行长度k和基本大小K:

n/K为您提供级别,(n%K)/k为您提供该级别的行。 如果我没有弄错的话,((n%K))%k应该给你行中的索引。

将此包装在一个包含该逻辑的类中,您可以将其视为外部的3d结构。

答案 2 :(得分:0)

ArrayList<Point[]>怎么样?您甚至可以考虑实现AbstractList来创建自己的列表(即使您在内部使用ArrayList)并包装Point数组创建......