我想创建一个动态2D矩阵,其中行数和列数是未知的。通过在当时添加一个元素来填充它。例如,第一个按钮单击= M [1] [1](此时,矩阵仅包含此元素),然后M [1] [2],[1] [3] ....等。
答案 0 :(得分:5)
使用集合来执行此操作。例如:
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
答案 1 :(得分:2)
这里有一个选项可以考虑让您的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
}
}
答案 2 :(得分:1)
你可以(1)使用一个哈希映射,它将点映射到按钮状态,并将最大行数和列数存储在单独的变量中;或者,您可以(2)使用树并为每一行添加一个节点,并将节点添加到相应的行节点以表示矩阵条目。
您还可以(3)使用整数的有序动态列表(数组列表,链表等),其中每个整数的第一个 n 位可以存储行,下一个列的 n 位,以及其余的位与按钮状态有关的任何数据。但是, n 的大小取决于行数和列数的最大界限。从列表中检索元素时,使用按位运算符提取相关数据。
如果使用数组列表,则分配的内存量最少(3),但是,由于数据结构的性质,当您添加额外元素时,每个条目将具有与之关联的一些额外数据。 (1);搜索速度最快; (2)和(3)都应该显示O(log(n))搜索时间,但我怀疑(3)由于数据局部性会明显更快。在方法(1)和(2)中,添加和删除元素将是最快的(1);方法(3)添加或删除元素所花费的时间取决于列表的实现。
我确定你可以使用其他很多我没有在此列出的结构,但你可能需要注意,如果你能保证行数和列数保持在合理范围内,那么使用静态数据结构可以真正加快速度。