Java动态2D矩阵

5
我希望创建一个动态的2D矩阵,行数和列数未知。通过逐个添加元素来填充它。例如,第一次按钮点击 = M [1] [1](此时,矩阵仅包含此元素),然后是M [1] [2],[1] [3]....等等。

3个回答

8
使用集合来实现这个功能。例如:
List<List<Integer>> dynamic2D = new ArrayList<List<Integer>>();

dynamic2D.add(new ArrayList<Integer>());
dynamic2D.add(new ArrayList<Integer>());
dynamic2D.add(new ArrayList<Integer>());

dynamic2D.get(0).add(5);
dynamic2D.get(0).add(6);
dynamic2D.get(0).add(7);

System.out.println(dynamic2D.get(0).get(0)); // 5
System.out.println(dynamic2D.get(0).get(1)); // 6
System.out.println(dynamic2D.get(0).get(2)); // 7

3

以下是考虑保持2D数组处理速度的一种选项。它从一个固定大小的int [][]数组开始,并在必要时才增长:

public class DynamicMatrix2D {
    private int[][] matrix = new int[5][5];

    public void set(int x, int y, int value) {
        if (x >= matrix.length) {
            int[][] tmp = matrix;
            matrix = new int[x + 1][];
            System.arraycopy(tmp, 0, matrix, 0, tmp.length);
            for (int i = x; i < x + 1; i++) {
                matrix[i] = new int[y];
            }
        }

        if (y >= matrix[x].length) {
            int[] tmp = matrix[x];
            matrix[x] = new int[y + 1];
            System.arraycopy(tmp, 0, matrix[x], 0, tmp.length);
        }

        matrix[x][y] = value;
    }

    public int get(int x, int y) {
        return x >= matrix.length || y >= matrix[x].length ? 0 : matrix[x][y];
    }

    public static void main(String[] args) {
        DynamicMatrix2D matrix2d = new DynamicMatrix2D();

        matrix2d.set(1, 1, 1);     // set (1, 1) to 1
        matrix2d.set(10, 10, 2);   // set (10, 10) to 2
        matrix2d.set(100, 100, 3); // set (100, 100) to 3

        System.out.println(matrix2d.get(1, 1));     // outputs 1
        System.out.println(matrix2d.get(10, 10));   // outputs 2
        System.out.println(matrix2d.get(100, 100)); // outputs 3 
    }
}

1
你可以采用以下三种方法之一来解决问题:
1. 使用哈希映射将点映射到按钮状态,并将最大行数和列数存储在单独的变量中;或者,你可以
2. 使用树,为每一行添加一个节点,并向相应的行节点添加节点以表示矩阵条目。
3. 你还可以使用有序的动态列表(数组列表、链接列表等)来存储整数,其中每个整数的前n位可以存储行,接下来的n位可以存储列,其余的位可以存储与按钮状态相关的任何数据。然而,n的大小取决于你的最大行数和列数的范围。当从列表中检索元素时,请使用位运算符提取相关数据。

如果使用数组列表,则分配的内存量最少为(3),但否则,由于数据结构的性质,每个条目在添加额外元素时都将有一些额外的数据与之关联。使用(1)进行搜索将是最快的;(2)和(3)都应该表现出O(log(n))的搜索时间,但我认为(3)由于数据局部性而会显着更快。对于方法(1)和(2),添加和删除元素将使用(1)最快;使用方法(3)添加或删除元素所需的时间取决于列表的实现。

我相信还有很多其他可以使用的结构,我没有在此列出,但您可能需要注意的是,如果您可以保证行数和列数保持在合理范围内,则使用静态数据结构确实可以加快速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接