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

Posted

技术标签:

【中文标题】Java:具有类似于 ArrayList 的方法/功能的二维数组【英文标题】:Java: Bidimensional Array with methods/capabilities similar to ArrayList 【发布时间】:2011-02-02 06:58:03 【问题描述】:

我想创建一个整数(或任何类型)的 XY 数组,但我想使用类似于 ArrayList 类的“add”、“remove”、“contains”、“indexOf”等方法。

是否有任何现有的类具有这些功能?

PS:我不想创建ArrayList的ArrayList

【问题讨论】:

"我不想创建 ArrayList 的 ArrayList" 为什么?它实际上完全符合您的描述。是因为你想使用原始类型吗? 没有。这是因为我想创建将占据多个单元格的对象,每个单元格都可以是垂直的或水平的。如果我们认为 ArrayList 是垂直的,我会遇到水平对象的问题,因为它们会同时使用 varios ArrayLists 的不同位置。 【参考方案1】:

根据您的描述,我建议您尝试使用 JAMA。 您还可以为 XY 矩阵创建自己的实现。但是,为此,您必须确定您想要从实施中获得什么。 如果您的 Matrix 不是固定大小的,那么您可以使用类似于 3 元组的格式来存储矩阵。 (仅当您的矩阵稀疏时,此表示才有效)。在内部,您将使用三个 ArrayList;一个用于存储行号,第二个用于存储列号,第三个用于存储实际值。 因此,您将编写 add(int row, int column, int value) 方法,该方法负责保持 ArrayLists 按行号排序,然后按列号等排序,以提高随机访问的效率。 通过这种表示,您可以实现所有可用于 ArrayList 的方法,例如 remove()contains()

【讨论】:

【参考方案2】:

不,AFAIK 没有这样的课程。但是实现一个应该相当容易:

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 方法 修复编译错误

【讨论】:

【参考方案3】:

查看 JAMA,它来自 Mathworks 和 NIST。

【讨论】:

【参考方案4】:

标准 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 java.sun.com/javase/6/docs/api/java/util/… 我的意思是Matrix.remove。首先,它只删除了第一个并发,这意味着您依赖于实现布局。其次,它以最类似于矩阵的方式向上移动剩余条目,并导致get 异常抛出。

以上是关于Java:具有类似于 ArrayList 的方法/功能的二维数组的主要内容,如果未能解决你的问题,请参考以下文章

redis的string字符串是动态字符串,是可以修改的字符串,内部结构的实现类似于java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配

如何创建ArrayList数组

Java中关于 ArrayList 和 Map 的常用遍历方法 (学习笔记,便于以后查询)

java源码学习ArrayList

Java集合源码分析ArrayList

JAVA集合之Arraylist使用方法