在Java中使用什么集合来代替2D数组?

2022-09-04 03:28:52

我想使用一个集合来代替2D数组,这样我就不需要在声明时给出它的大小,我可以动态地添加任意数量的元素。


答案 1

List>的问题在于,如果要重新调整矩阵,则必须重新调整每行。

如果你想使用稀疏矩阵,或者一个无限矩阵,你可以做这样的事情:

class SparseMatrix<X> {
  private Map<Coord, X> values = new HashMap<Coord, X>();

  public SparseMatrix() {
  }

  public X get(int x, int y) {
     return values.put(new Coord(x,y)); // null if there's no value
  }

  public void set(int x, int y, X value) { // you can use null (like in a List)
     values.set(new Coord(x,y), value);
  }

  private static class Coord {
    int x; int y;
    public Coord(int x, int y) {
       this.x = x;
       this.y = y;
    }

    @Override
    public boolean equals(Object other) {
       if (other instance of Coord) {
          Coord o = (Coord) other;
          return o.x == x && o.y == y;
       }
       return false;
    }

    @Override
    public int hashCode() {
       return o.x + o.y; // or some more clever implementation :)
    }

  }
}

编辑:Apache Commons HashCodeBuilder是生成哈希代码的好工具。


答案 2

最简单的方法是使用嵌套集合...比如说(假设你的值是字符串),然后可以这样使用:List<List<String>>

List<List<String>> fakeArray = new ArrayList<List<String>>();

// Pretend you fill it with values between these calls
String retrieve = fakeArray.get(0).get(0);

编辑:这最初是一个在这种情况下真的没有意义的东西。Map<String,List<String>>

但是,您可能想看看Google CollectionsApache Commons Collections是否有更专业的东西可以使用。