java - 存储静态对象列表的最有效方法是什么?

标签 java arrays performance arraylist hashmap

我正在尝试存储不同敌人的列表。每个敌人都有一个起源,并且只能在其起源位置生成。每个敌人也有一个难度,应该与相同难度的敌人一起存放。

我把它想象成一个静态的 3D 敌人阵列,如下所示:

Enemy[mountain][2][5] = new Enemy("troll")

字段所在的位置(从左到右)位置,难度,索引。

玩家进入的每个位置都会从这个静态数组中填充一个敌人数组列表。

在这种情况下是否可以使用更高效的数据结构?

(此列表将被硬编码,在程序运行期间不应更改)

编辑-

我希望优化访问时间。该游戏将生成多个位置,每个位置都需要根据来源和难度从列表中随机抽取敌人。

根据要求,我将对这个程序的用例进行更多思考。一旦我有了合适的解决方案,我就会更新。 (谢谢)

最佳答案

这在概念上是明智的,但不是一个好主意。

此时您真的不必担心性能。您担心创建一个有用的对象模型,它可以让您编写优雅、易于阅读和易于增强的代码。

使用 3D 阵列无法实现这些目标。

换句话说:你退后一步;并仔细考虑需要访问 Enemy 对象的“用例”。从那里开始,您决定是否应该使用不同的 map ;或不同的集合,...而不是使用 3D 作为中央“存储点”。

编辑,考虑到您的评论:这里有两个方面:

  1. Java 中的数组非常不灵活。您不能动态更改它们的大小。除此之外,它们使用起来真的很“丑陋”:这种通过“3 维”的方式可能对某个“访问路径”很方便;但它可能会使其他事情变得非常困难(比如在搜索某个敌人时,然后你必须做这个 3-dim 迭代的东西......如前所述:丑陋)
  2. 人们应该尝试做出对“发生率”高的变化“开放”的设计。例子:你今天有固定数量的敌人;但假设你的“游戏”适合你;您迟早(更早)会想要增强它;例如通过允许动态添加/删除敌人。然后,您使用 3-D 数组编写的大量代码……将成为真正的障碍。

除此之外:是的,在“游戏世界”中,应该有一个组件负责跟踪游戏中的所有元素。但是:这个组件如何在内部组织事物更多的是一个实现细节。您应该首先将“有用”的方法放在该 GameWorld 上;或者正如我之前所说:了解您的代码需要如何访问/迭代/搜索敌人以执行游戏本身。然后您查看支持这些“用例”的数据结构。

最后:假设这是一个学习练习 - 您仍然可以从 3d 数组开始。它会教给你很多东西;我只是指出:您不会在更“真实世界”的应用程序中这样做;如果你选择这个选项,你很快就会遇到某些限制/障碍;仅取决于您的解决方案的性质。

关于java - 存储静态对象列表的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42513147/

相关文章:

javascript - javascript中的for循环以增量方式访问元素

C:元素大小不同的数组

java - 在 JPA 或 Hibernate 查询中使用 Constructor Result 会影响性能吗?

java - 导出项目jar文件中的jdbc

java - JVM到底是如何编译三元运算符的?我应该关注不同的 api 版本吗?

c - 如何从 C 函数返回二维数组?

c++ - 如何在opencv c++中有效清除 vector <Mat>

r - 是否有更快的方法来合并数据帧并循环组合?

java - java中鼠标拖动时如何生成新图片

java - 在android应用程序中实现时间延迟