为Grid类结构实现java.util.Collection是否合适?

时间:2014-12-30 06:17:14

标签: java collections grid

我目前正在研究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警告,那么继续执行奇怪的行为会更好吗?

2 个答案:

答案 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

中的方法