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

在Java中使用什么集合来代替2D数组?,java,collections,Java,Collections,我想用一个集合来代替2D数组,这样我就不需要在声明时给出它的大小,我可以动态地添加任意多的元素。我个人就是为了这个目的使用这个类的,尽管不同的需求最终可能会决定使用其他更专业的类 java.util.ArrayList是我的首选 导入java.util.ArrayList ArrayList是您想要的,您不需要在创建时设置其大小,您可以使用add方法动态添加元素。最简单的方法是使用嵌套集合。。。假设(假设您的值是字符串)列表,可以这样使用: List<List<String>&

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

我个人就是为了这个目的使用这个类的,尽管不同的需求最终可能会决定使用其他更专业的类

java.util.ArrayList是我的首选


导入
java.util.ArrayList


ArrayList
是您想要的,您不需要在创建时设置其大小,您可以使用
add
方法动态添加元素。

最简单的方法是使用嵌套集合。。。假设(假设您的值是字符串)
列表
,可以这样使用:

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

// Pretend you fill it with values between these calls
String retrieve = fakeArray.get(0).get(0);
List fakeArray=new ArrayList();
//假设在这些调用之间填充了值
String retrieve=fakeArray.get(0).get(0);
编辑:这最初是一张
地图
,在这种情况下没有意义


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

这取决于您正在尝试做什么,但我建议使用ArrayList。它比向量快。除非你关心同步!如果您想将其作为二维列表,那么您可以创建一个ArrayList,该列表中的每个元素都将是另一个ArrayList。

您可以使用
ArrayList
作为项目进行试验。如果这不能满足你的需要,那么它将为你自己的发展提供动力。

你想用它做什么?我可能只会使用一个
集合
(其中集合可能会被列表替换)


或者,您可以使用metods创建自己的类,以根据需要迭代行、列或所有元素。

这取决于您希望使用数据结构的方式。你的选择是:

  • 两份清单;在它们之间同步是您的工作
  • 地图;映射条目将只是对象的元组,而不是键值关系
  • 2单元对象数组的列表;列表中的每个项目都将是一个大小为2的对象数组
编辑: 我完全误解了这个问题;我以为这是一个宽度为2的2D数组


正确地阅读了问题(我希望:-),我同意那些说列表列表的人。

列表>的问题是,如果要重新确定矩阵的尺寸,必须重新确定每一行的尺寸

如果要使用稀疏矩阵或无限矩阵,可以执行以下操作:

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 :)
    }

  }
}
类SparseMatrix{
私有映射值=新的HashMap();
公共稀疏矩阵(){
}
公共X获取(整数X,整数y){
返回值。put(new Coord(x,y));//如果没有值,则为null
}
公共void集(intx,inty,x值){//您可以使用null(就像在列表中一样)
设置(新坐标(x,y),值);
}
私有静态类坐标{
int x;int y;
公共合作社(国际x、国际y){
这个.x=x;
这个。y=y;
}
@凌驾
公共布尔等于(对象其他){
if(协调的其他实例){
坐标o=(坐标)其他;
返回o.x==x&&o.y==y;
}
返回false;
}
@凌驾
公共int hashCode(){
返回o.x+o.y;//或更聪明的实现:)
}
}
}

编辑:是生成哈希代码的一个很好的工具。

您将使用什么模式来访问数组中的元素?随机访问,一整行,一整列?我认为当我们想要动态的一维数组时,可以使用它。你可以有一个数组列表,它的每个元素都是另一个数组列表(正如rsp和我在回答中所建议的)。通过这种方式,ArrayList也可以用于2D数组。Vector非常不受欢迎,已经被ArrayList所取代。@mortiz-
java.util.Vector
通常应该避免-它的线程安全性对于大多数多线程场景不是很有用,只会增加单线程使用的开销。大多数人使用
ArrayList
作为默认的
List
类型。您的哈希代码可能会溢出-但是您确实对其进行了相应的注释…:)锐利的视野!!!有一个实用方法:java.util.Arrays.hashCode(int[]),它为int[]生成一个hashCode,但是当然,每次需要hashChode时创建一个数组(或者创建它)并不好。也许我们可以复制它的实现,只需要两个整数:(31+o.x)*31+o.y。但它似乎还是溢出了。。。(我认为这不重要,是循环的吗?)。在hashCode()中,x+y==y+x重要吗?不,不重要。hashCodes的重要一点是,它们提供了非常分散的值,因此如果您有N个bucket,那么您可以使用该hashCode或多或少地均匀地分布它们(将对象X放入bucket
hasCode(X)%N
。这就是我的实现不好的原因:如果使用低坐标,它会给出低哈希代码。我将添加对Apache HashCodeBuilder的引用。它非常好地封装了这个问题。我将删除此“编辑”信息-现在也没有意义;p