gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:48:13 25 4
gpt4 key购买 nike

我正在为小型游戏框架的实体组件系统编写一个简单的实体管理器。我的实体管理器类处理分配给实体(一个简单的最终对象,只有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com