我有一个' 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);
}
答案 0 :(得分:0)
有许多权衡。
ID为阻止的哈希地图,对于您的ID,您可以直接查找,然后查找我想要迭代地图值的位置。我不确定你的位置对象是什么,但是坐标是什么?这种方法可以让您的功能增长,以找到附近位置的块。当我将复杂对象看作哈希映射中的键时,我会担心,因为您必须确保根据业务逻辑正确实现equals和hash代码。 Guava库总是通过过滤函数过滤集合的很好的功能方法。 (像流利的Iterable一样)
您的方式,只需确保您实现哈希码和等号。你能告诉我们更多这个位置对象是什么吗?