我想用一个集合代替2D数组,这样我就不需要在声明时给出它的大小了,我可以动态地添加任意数量的元素。
答案 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 Collections或Apache Commons Collections是否有更专业的内容供您使用。
答案 2 :(得分:2)
您希望能用它做什么?我可能只是使用Collection<Collection<Element>>
(其中Collection可能被List替换)。
或者您可以使用元数据创建自己的类,以根据需要迭代行或列或所有元素。
答案 3 :(得分:0)
我个人正在为此目的使用Vector类,尽管不同的要求可能最终要求使用其他更专业的类。
答案 4 :(得分:0)
java.util.ArrayList是我的首选。
http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html
答案 5 :(得分:0)
导入java.util.ArrayList;
ArrayList
是你想要的,你不需要在创建时设置它的大小,你可以使用add
方法动态添加元素。
答案 6 :(得分:0)
这取决于你想要做什么,但我会推荐ArrayList。它比Vector快。除非你关心同步!如果你想把它作为一个二维列表,那么你创建一个ArrayList,这个列表的每个元素都是另一个ArrayList。
答案 7 :(得分:0)
您可以使用ArrayList
ArrayList
作为项目进行试用。如果那不能达到你想要的效果,那就会让你对自己需要的东西保持清醒。
答案 8 :(得分:0)
这取决于您想要使用数据结构的方式。您的选择是:
修改强> 我完全误解了这个问题;我认为它是关于宽度为2的2D数组。
正确阅读了问题(我希望:-)),我同意那些列出名单的人。