我有一个Matrix类,旨在封装原始数组array。我需要使用通用版本而不在内部使用对象来解决内存分配问题。用Java有什么办法做到这一点?我可以制作一系列的if语句来检查类型,但是也许有更好的方法来实现它。
答案 0 :(得分:2)
您始终可以将数组包装在实现List<List<Integer>>
的对象中,然后将其视为矩阵。
private static class Matrix extends AbstractList<List<Integer>> implements List<List<Integer>> {
final int[][] data;
private static class Row extends AbstractList<Integer> implements List<Integer> {
final int[] row;
public Row(int[] row) {
this.row = row;
}
@Override
public Integer get(int index) {
return row[index];
}
@Override
public int size() {
return row.length;
}
}
public Matrix(int[][] data) {
this.data = data;
}
@Override
public List<Integer> get(int index) {
return new Row(data[index]);
}
@Override
public int size() {
return data.length;
}
}
public List<List<Integer>> asMatrix(int[][] data) {
return new Matrix(data);
}
private void test() {
int[][] test = new int[][] {
{1,2,3},
{4,5,6},
{7,8,9}
};
List<List<Integer>> matrix = asMatrix(test);
System.out.println(matrix);
}
这种方法可以扩展为仅通过在内部set
类中实现Row
就可以写回内部数组。扩展Matrix
以允许使用get(row,col)
方法很简单。
您需要为每个需要处理的原语编写一个。
答案 1 :(得分:0)
出于速度和紧凑性的考虑,我们许多人在原始类数组的顶部添加了矩阵访问器shim。例如(伪代码)
Companies
答案 2 :(得分:0)
一些现有的Java线性代数库对此进行了设计。要查看在ojAlgo中是如何完成的,请查看org.ojalgo.array包中的类:
https://github.com/optimatika/ojAlgo/blob/develop/src/org/ojalgo/array/Array2D.java
实际的线性代数类扩展或委托给数组包中的各个类。