我想在Java中用合适的数据结构表示类似矩阵的数据。该矩阵的尺寸取决于用户输入。一种方法可能是使用“魔术”最大常数,并使用简单的多维数组。但是对数据的操作在很大程度上取决于维度,我想避免使用固定数组,因为我总是需要跟踪使用的和最大的维度。当然,更动态的方法是定义类似
的内容private ArrayList<ArrayList<ArrayList<Point>>> arr3d = new ArrayList<ArrayList<ArrayList<Element>>>();
我认为这是不可接受的丑陋。最好定义自定义数据结构,即一维ArrayList(或Vector),然后以某种方式将其包装,即将指定为[i,j,k]的访问映射到该单个列表的某个元素。是否可以覆盖运算符[]?如何有效地做到这一点?是否有一些我可以依赖的现有库或代码?
PS:我认为这可能是一个常见的问题,但尽管付出了最大的努力,我还没有找到现有的问题。如果我错过了一些答案,请提前道歉。答案 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
数组创建......