将对象存储在多个位置

时间:2014-07-20 01:02:30

标签: java

我有一个' Block'需要通过其位置访问的对象,但我还需要通过其ID及其“更新间隔”访问它。 (重绘的间隔)。

最初我将所有内容存储在地图中,并将位置作为键,并在地图中迭代以查找更新间隔和ID。我想要一个更快的方法,并考虑将具有不同值的多个地图作为键。

这是一种很好的做事方式吗?在我看来,这是一个巨大的空间浪费,因为你在多个区域中复制了对象引用,如果创建了一个新对象,则需要更新所有对象引用。

示例:

class Block {
    private final int id;
    private final Location location;

    public Block(int id, Location location) {
        this.id = id;
        this.location = location;
    }

    public int getId() {
        return id;
    }

    public Location getLocation() {
        return location;
    }
}

使用一张地图:

private Map<Location, Block> blocks = new HashMap<Location, Block>();

public Block getBlock(Location location) {
    return blocks.get(location);
}

public Block getBlock(int id) {
    for (Block block : blocks.values()) {
        if (block.getId() == id) {
            return block;
        }
    }

    return null;
}

两张地图的方式:

private Map<Location, Block> locationsToBlocks = new HashMap<Location, Block>();
private Map<Integer, Block> idsToBlocks = new HashMap<Integer, Block>();

public Block getBlock(Location location) {
    return locationsToBlocks.get(location);
}

public Block getBlock(int id) {
    return idsToBlocks.get(id);
}

1 个答案:

答案 0 :(得分:0)

有许多权衡。

选项1:简单

ID为阻止的哈希地图,对于您的ID,您可以直接查找,然后查找我想要迭代地图值的位置。我不确定你的位置对象是什么,但是坐标是什么?这种方法可以让您的功能增长,以找到附近位置的块。当我将复杂对象看作哈希映射中的键时,我会担心,因为您必须确保根据业务逻辑正确实现equals和hash代码。 Guava库总是通过过滤函数过滤集合的很好的功能方法。 (像流利的Iterable一样)

选项2

您的方式,只需确保您实现哈希码和等号。你能告诉我们更多这个位置对象是什么吗?