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

标签 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>>();

通过这种方式,我可以非常快速地从 HashMap 中检索具有特定 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;

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

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

编辑:为了消除一点困惑,我还希望能够从实体中删除一个组件,如果那是对单个实体的唯一引用,我想将其删除。 但如果不线性遍历所有三个结构,我无法判断是否存在对实体的任何引用

最佳答案

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

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

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

关于java - 从复杂数据结构中删除对象的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8964398/

相关文章:

java - 我类(class)的数据为空?

java - 如何在网页上录制音频并存储在数据库中

c - 将文件扫描为嵌套结构

java - 我们如何计算字符串中字符的频率

algorithm - 如何在添加时对数据进行排序,而不是稍后?

java - 使用 Java/Scala 解析与硬件的 ASCII 通信?

java - 反序列化后如何自动执行方法?

java - 使用 "try with resources"创建没有任何引用的资源

algorithm - 打印安装包所需的最小包集

c++ - 从字符串列表生成正则表达式