Java:具有与ArrayList相似的方法/功能的二维数组

6
我想创建一个整数(或其他类型)的 XY 数组,但我想要使用类似于 ArrayList 类中的 "add"、"remove"、"contains"、"indexOf" 等方法。
是否存在具有这些功能的现有类?
PS:我不想创建一个 ArrayList 的 ArrayList。

1
我不想创建一个ArrayList的ArrayList。为什么?实际上它完全符合您的描述。是因为您想使用原始类型吗? - Searles
不行。这是因为我想创建占据多个单元格的对象,每个对象可以是垂直或水平的。如果我们认为 ArrayList 是垂直的,那么对于水平的对象,我会遇到问题,因为它们将同时使用各种 ArrayList 的位置。 - Paulo Coghi
4个回答

3
不,据我所知没有这样的类。但是实现一个应该相当容易:
class BiDimensionalArray<T>{
  Object[][] backupArray;
  int lengthX;
  int lengthY;

  public BiDimensionalArray(int lengthX, int lengthY) {
    backupArray = new Object[lengthX][lengthY];
    this.lengthX = lengthX;
    this.lengthY = lengthY;
  }

  public void set(int x, int y, T value){
    backupArray[x][y] = value;
  }

  public T get(int x, int y){
    return (T) backupArray[x][y];
  }

  public void addX(T[] valuesY) {
    Object[][] newArray = new Object[lengthX+1][lengthY];
    System.arraycopy(backupArray, 0, newArray, 0, lengthX);
    newArray[lengthX]=valuesY;
    backupArray = newArray;
    lengthX = lengthX+1;
  }
}

注意:Typeparameter在内部没有使用,因为没有 new T[][] 这样的东西。

编辑
添加了addX方法以进行演示
修复编译错误


2
根据您的描述,我建议您尝试使用JAMA。您也可以为XY Matrix创建自己的实现。然而,为了做到这一点,您需要决定您希望从此实现中得到什么。
如果您的Matrix不是固定大小的,则可以使用类似于3元组格式来存储矩阵(仅在矩阵稀疏时此表示法才有效)。在内部,您将使用三个ArrayList;一个用于存储行号,第二个用于存储列号,第三个用于存储实际值。
相应地,您将编写add(int row, int column, int value)方法,该方法会处理像保持ArrayList按行号排序,然后按列号排序等等以增加随机访问效率的事情。
有了这种表示形式,您可以实现所有可用于ArrayList的方法,例如remove(),contains(),等等。

1

标准的Java库中没有原生的矩阵类型。尽管如此,创建一个矩阵相当容易。这些方法很容易实现,并且可以使用数组、List或其他方式进行支持。

public class Matrix<T> {
  private final List<T> values;
  private final int rows;

  public Matrix(int x, int y) {
    this.rows = x;
    values = new ArrayList<T>(x * y);
  ]

  public int get(int x, int y) {
    return values.get(x * rows + y);
  }

  public boolean contains(T t) {
    return values.contains(t);
  }

  // etc
}

你对remove函数有什么期望?(你想要检查一下参数吗?) - Tom Hawtin - tackline
@Tom http://java.sun.com/javase/6/docs/api/java/util/List.html#remove(java.lang.Object) - cletus
1
我的意思是 Matrix.remove。首先,它只删除第一个匹配项,这意味着您依赖于实现布局。其次,它以最不像矩阵的方式向上移动剩余条目,并导致 get 抛出奇怪的异常。 - Tom Hawtin - tackline

1

看看JAMA,它来自Mathworks和NIST。


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