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

Java 存储静态对象列表的最有效方法是什么?,java,arrays,performance,arraylist,hashmap,Java,Arrays,Performance,Arraylist,Hashmap,我正试图储存一份不同敌人的名单。每个敌人都有一个来源,只能在其来源地产卵。每个敌人也有难度,应该和相同难度的敌人一起储存 我把它想象成一个静态的3D敌人阵列,如下所示: Enemy[mountain][2][5] = new Enemy("troll") 其中字段是(从左到右)位置、难度和索引 玩家进入的每个位置都会从这个静态阵列中填充一个敌人的阵列列表 在这种情况下,是否有更有效的数据结构可供使用 (此列表将采用硬编码,在课程过程中不得更改) 编辑- 我希望优化访问时间。该游戏将生成多个位置

我正试图储存一份不同敌人的名单。每个敌人都有一个来源,只能在其来源地产卵。每个敌人也有难度,应该和相同难度的敌人一起储存

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

Enemy[mountain][2][5] = new Enemy("troll")
其中字段是(从左到右)位置、难度和索引

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

在这种情况下,是否有更有效的数据结构可供使用

(此列表将采用硬编码,在课程过程中不得更改)

编辑-


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


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

从概念上讲,这不是一个好主意

此时,您真的不必担心性能。您需要创建一个有用、有用的对象模型,该模型允许您编写优雅、易于阅读且易于增强的代码

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

换句话说:你后退一步;仔细考虑需要访问敌人对象的“用例”。从那里开始,你决定是否使用不同的地图,例如;或不同的集合。。。而不是使用3D作为中心“存储点”

根据您的评论进行编辑:这里有两个方面:

  • 数组在Java中非常不灵活。您无法动态更改其大小。除此之外,他们真的是“丑陋”的使用:这通过“三维”可能是一个特定的“上升路径”方便;但这可能会让其他事情变得非常困难(比如当搜索某个敌人时,你必须做这个3维迭代的事情……就像上面说的:丑陋)
  • 一个人应该尝试做出“开放”的设计,以应对“发生”率很高的变化。今天你有固定数量的敌人;但是假设你的“游戏”适合你;你迟早(相当快)会想要增强它;例如,允许动态添加/删除敌人。然后你用3D数组写的很多代码。。。会成为真正的障碍
  • 除此之外:是的,在“游戏世界”中,应该有一个负责跟踪游戏中所有元素的组件。但是:这个组件如何在内部组织更多的是一个实现细节。你应该把重点放在把“有用的”方法放在游戏世界的第一位;或者正如我之前所说的:理解代码如何访问/迭代/搜索敌人以执行游戏本身。然后研究支持这些“用例”的数据结构


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

    从概念上讲,这不是一个好主意

    此时,您真的不必担心性能。您需要创建一个有用、有用的对象模型,该模型允许您编写优雅、易于阅读且易于增强的代码

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

    换句话说:你后退一步;仔细考虑需要访问敌人对象的“用例”。从那里开始,你决定是否使用不同的地图,例如;或不同的集合。。。而不是使用3D作为中心“存储点”

    根据您的评论进行编辑:这里有两个方面:

  • 数组在Java中非常不灵活。您无法动态更改其大小。除此之外,他们真的是“丑陋”的使用:这通过“三维”可能是一个特定的“上升路径”方便;但这可能会让其他事情变得非常困难(比如当搜索某个敌人时,你必须做这个3维迭代的事情……就像上面说的:丑陋)
  • 一个人应该尝试做出“开放”的设计,以应对“发生”率很高的变化。今天你有固定数量的敌人;但是假设你的“游戏”适合你;你迟早(相当快)会想要增强它;例如,允许动态添加/删除敌人。然后你用3D数组写的很多代码。。。会成为真正的障碍
  • 除此之外:是的,在“游戏世界”中,应该有一个负责跟踪游戏中所有元素的组件。但是:这个组件如何在内部组织更多的是一个实现细节。你应该把重点放在把“有用的”方法放在游戏世界的第一位;或者正如我之前所说的:理解代码如何访问/迭代/搜索敌人以执行游戏本身。然后研究支持这些“用例”的数据结构


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

    我想到的是一张地图。位置是关键,值是表示敌人及其位置的对象列表-让我们称之为包含敌人及其位置的EneyLocation对象(或者您可以将敌人更改为包含其位置,这似乎是个好主意,但我不知道您的代码)。因此,当玩家进入“山地”区域时,你会做一些类似于敌人的事情