gpt4 book ai didi

java - 针对此存储的数据运行测试的最有效方法

转载 作者:行者123 更新时间:2023-12-01 18:03:12 25 4
gpt4 key购买 nike

抱歉,标题内容不太丰富,我想不出更好的了。当我说高效时,我指的是不占用 CPU 资源的代码。

问题:想象一艘由方 block 组成的 3D 宇宙飞船,就像《我的世界》中的飞船一样。我想将这个 shapeship 中每个方 block 的位置存储在一个自制的 Ship 类中。

为此,我使用 private List<ShipBlock> shipBlocks;在 Ship 类中。这里的ShipBlock是一个自制的类,以 vector 的形式持有一个位置Vec3(int x, int y, int z)以及一些与此问题无关的其他信息。

但现在我想在船上进行测试。船舶是否在某个 testPosition (x, y, z) 上包含 ShipBlock,如果是,则返回该 ShipBlock。然而,我还没有找到有效地做到这一点的方法。循环遍历整个列表并根据测试位置测试每个位置的成本非常昂贵,而且我希望它能够快速。

因此,我决定制作一个 Map<Vec3, ShipBlock> shipBlocksMap来存储信息。其中关键在于 ShipBlock 的位置。我可以简单地做 shipBlocksMap.get(testPosition)如果船舶在该位置有 ShipBlock,它将返回正确的 ShipBlock。如果不是,它将返回 null。

这似乎正是我想要的,直到我移动了船并且所有 ShipBlock 都得到了新的位置。我在这里了解到,如果您作为键提供的对象发生变化,则 map 中的键不会更改。因此,如果我现在使用 shipBlocksMap.get(testPosition)使用移动船舶中的位置,它将返回 null,因为 key 仍然是旧位置。 (抱歉,如果这令人困惑,我不知道如何更好地解释它)

问题:我在这里问的问题是:假设一艘船可以包含数以万计的ShipBlock,那么测试它是否包含具有特定位置的ShipBlock的最有效方法是什么。我应该以什么方式存储船舶的 ShipBlocks 以便检查有效进行?

代码:如果有人想看的话,这里是 Ship 和 ShipBlock 类的代码。

public class ShipBlock 
{
public Vec3 position;
public String shipBlockType;

public ShipBlock(Vec3 position, String shipBlockType)
{
this.position= position;
this.shipBlockType = shipBlockType;
}
}

public class Ship
{
private Map<Vec3, ShipBlock> shipBlocksMap;

public Ship(Map<Vec3, ShipBlock> shipBlocksMap)
{
this.shipBlocksMap = shipBlocksMap;
}

public ShipBlock containsShipBlock(Vec3 position)
{
return shipBlocksMap.get(position);
}
}

最佳答案

我认为最重要的设计变化是保存区 block 相对于船舶位置的位置。

这样,当船舶移动时,您不需要更改 block 的键,并且可以轻松地使用您的 Map<Vec3, ShipBlock> shipBlocksMap对于恒定时间测试,其中关键是相对位置。您可以通过计算(概念上)relative_block_pos = absolute_block_pos - ship_pos来获得相对位置.

这意味着您需要存储船舶的位置。作为一个选择,您可以简单地选择船舶的第一个 block 作为船舶的位置,因此第一个 block 始终具有坐标 (0, 0, 0) .

这样,更改所有 block 的坐标就会减少到最少(但在大多数情况下不需要)。

关于java - 针对此存储的数据运行测试的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39039905/

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