我目前正在研究Grid类的自定义实现,因为我经常发现自己在很多程序中都使用了网格,并且在这个类中实现大量操作比继续使用2D更方便。 ArrayLists的数组或ArrayLists。
我正在考虑让Grid类从java.util.Collection实现Collection接口,但是我遇到了一些方法实现的问题,让我怀疑它是否适合实现给定Grid类性质的接口。
特别是,以下方法似乎在我的网格中没有正确的实现:
public int size();
public boolean isEmpty();
add(E e)
addAll(Collection<? extends E> c)
boolean retainAll(Collection<?> c)
其中许多不能完全适用于我的实现的原因是因为我决定使我的Grid类大小不可变(虽然不是元素本身),因为缩小网格可能有不明确的行为(我在考虑只需要通过警告切断必要的行/列,并且因为网格强制使用矩形大小(因此通过用null
填充剩余空格来处理锯齿状的行大小。)
添加方法很难实现,因为我通常会看到将一个对象添加到网格中,因为需要一个坐标来添加它。从技术上讲,我可以从上到下扫描网格,从左到右扫描第一个空方块,但这可能不是最终客户端将Grid传递给只接受Collection对象的函数的期望行为。
这些方法中的大多数做都有某种形式的实现,我可以使用它在技术上有用,但它们不是我看到的Grid类的典型用法。
鉴于此,它是否使得实施Collection不合适?或者,如果我添加Javadoc警告,那么继续执行奇怪的行为会更好吗?
答案 0 :(得分:1)
您可以实施Collection
,但它并非完美契合。由于您的网格是不可变的(或者只是网格大小?),只需为任何变异调用抛出UnsupportedOperationException
。您的Grid
类是否应该实施Collection
取决于您对它的使用方式。无论哪种方式都有利弊。
答案 1 :(得分:0)
不是一个答案,但写评论太久了。为您的网格使用map
maps
会不会更容易(因为您已经说过尝试使用列表)。
像
这样的东西 Map<Integer, Map<Integer, YourCustomObject>> grid= new HashMap<Integer, Map<Integer, YourCustomObject>>();
然后,您可以通过滥用地图实现和键的使用来编写添加/删除/ etc的方法(因为它们是唯一的)。以下是一些例子:
public void putYourCustomObject(int x, int y, YourCustomObject obj) {
if (!grid.containsKey(x)) {
grid.put(x, new HashMap<Integer, YourCustomObject>());
}
grid.get(x).put(y, obj);
}
public boolean yourCustomObjectExists(int x, int y) {
if (!grid.containsKey(x))
return false;
else
return grid.get(x).containsKey(y);
}
public void removeYourCustomObject(int x, int y) {
if (grid.containsKey(x)) {
if (grid.get(x).containsKey(y)){
grid.get(x).remove(y);
}
}
}
public boolean isEmpty() {
return grid.isEmpty();
}
public int size() {
int size = 0;
for (int i = 0; i < grid.size(); i++) {
size += grid.get(i).size();
}
return size;
}
等等。只是想知道为什么你不喜欢这种方法,而不是必须实现Collection