从复杂的数据结构中删除所有对象实例

时间:2012-01-22 20:25:37

标签: java data-structures

我正在为一个小型游戏框架的实体组件系统编写一个简单的实体管理器。我的实体管理器类处理分配给实体的组件(简单数据存储对象)(一个简单的最终对象,只有一个ID属性)。它还处理与这些实体关联的标签和组(作为字符串)。

我按以下方式列出数据:

private Map<String, Entity> tags = new HashMap<String, Entity>();

private Map<String, List<Entity>> groups = new HashMap<String, List<Entity>>();

private Map<Class<? extends Component>, Map<Entity, Component>> components = new HashMap<Class<? extends Component>, Map<Entity, Component>>();

这样我可以非常快速地从哈希映射中检索具有某个type组件的所有实体。其他两个也是如此。

问题在于我希望能够从系统中完全删除实体(并且可能还能够检查实体何时没有更多引用,因此它可能会返回到池中),但我不知道不知道如何在不迭代所有三个结构的情况下做到这一点。

// find if entity is in a group
for (List<Entity> entity : groups.values()) {
    if (entity.contains(e)) return true;
}

return false;

// even more complex, find if entity has any behaviors
for (Map<Entity, Component> entry : components.values()) {
    if (entry.keySet().contains(entity)) return true;
}

return false;

我可以使用哪种更好的结构,不会牺牲查找速度,或者添加另一种结构来轻松检查实体是否在上述结构中没有引用?

我不想向实体类添加任何内容,因为它本身不应包含任何数据。

编辑:为了澄清一点混淆,我还希望能够从实体中删除一个组件,如果这是对单个实体的唯一引用,我想删除它。 但我不知道是否有任何对实体的引用而没有线性地遍历所有三种结构

1 个答案:

答案 0 :(得分:1)

您可以尝试保留一个数据结构,将每个实体映射到包含它的List和Map结构:

Map<Entity,List<List<Entity>> activeLists;
// delete function
for (List<Entity> x : activeLists.get(entity))
{
   x.remove(entity);
}

另一个想法是使用更通用的图形数据结构,其中节点可以是实体,组,标签等等。然后完全删除实体只是删除图中的节点;如果要查询实体所属的组,只需遍历其边缘以查找组的边缘。