在Java中使用什么集合而不是2D数组?

时间:2010-01-12 16:31:18

标签: java collections

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

9 个答案:

答案 0 :(得分:7)

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是生成哈希码的绝佳工具。

答案 1 :(得分:4)

最简单的方法是使用嵌套集合...说(假设您的值是字符串)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是否有更专业的内容供您使用。

答案 2 :(得分:2)

您希望能用它做什么?我可能只是使用Collection<Collection<Element>>(其中Collection可能被List替换)。

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

答案 3 :(得分:0)

我个人正在为此目的使用Vector类,尽管不同的要求可能最终要求使用其他更专业的类。

答案 4 :(得分:0)

答案 5 :(得分:0)

导入java.util.ArrayList;

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

答案 6 :(得分:0)

这取决于你想要做什么,但我会推荐ArrayList。它比Vector快。除非你关心同步!如果你想把它作为一个二维列表,那么你创建一个ArrayList,这个列表的每个元素都是另一个ArrayList。

答案 7 :(得分:0)

您可以使用ArrayList ArrayList作为项目进行试用。如果那不能达到你想要的效果,那就会让你对自己需要的东西保持清醒。

答案 8 :(得分:0)

这取决于您想要使用数据结构的方式。您的选择是:

  • 两个清单;你的工作就是他们之间的同步。
  • 地图;而不是键值关系,您的地图条目将只是对象的元组。
  • 2个单元格对象数组的列表;列表中的每个项目都是一个大小为2的对象数组。

修改 我完全误解了这个问题;我认为它是关于宽度为2的2D数组。

正确阅读了问题(我希望:-)),我同意那些列出名单的人。