【问题标题】:Best way to "wrap" an ArrayList in Java?在 Java 中“包装”一个 ArrayList 的最佳方式是什么?
【发布时间】:2011-12-23 13:12:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我还是不明白为什么不用数组...
  • @m0skit0 因为您必须静态声明它们的维数(即double[][] vs double[][][]),并且操作员说这将在运行时确定。 (我猜)

标签: java arraylist multidimensional-array


【解决方案1】:

为什么不创建自己的类来包装它?它可以在内部包含您的 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)。

【讨论】:

    【解决方案2】:

    从您的问题中并没有立即清楚矩阵的最大维度是什么意思。是始终是 3 维的,还是可以根据用户的输入是 N 维的?

    假设它是 3 维的,它是规则的吗?每个矩阵 [i,j]、[i,k] 和 [j,k] 是否与所有其他矩阵相同?

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

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

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

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

    【讨论】:

      【解决方案3】:

      ArrayList&lt;Point[]&gt; 呢?您甚至可以考虑实现AbstractList 来创建自己的列表(即使您在内部使用ArrayList)并包装Point 数组创建...

      【讨论】:

        猜你喜欢
        • 2015-12-24
        • 2011-06-18
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多